python3 字母的音符标记的统一规范,以及去掉音符标记

音符标记:

sño对于这样的字符串,字母上面有这种标记,叫做音符标记。

ASCII()函数返回一个可打印的对象字符串方式表示,如果是非ascii字符就会输出\x,\u或\U等字符来表示。

    

这种音符字母ñ有两种形式。第一种是使用字符ñ的全组成(fully composed),只使用一个code point。

第二种是使用字符n和~组成,使用两个code point。

如上图程序所示,打印效果同样是sño,却同时对应两个字符串。所以对于这样的问题,需要对其进行规范化。

统一规范

   

如上图程序所示(使用前import unicodedata),使用normalize函数进行规范化,第一个参数可以是NFC表示字符应该是全组成的,也可以是NFD表示应该使用组合字符,每个字符能完全分解开来

所以,s1没有变化因为它本来就是NFC的,而s2改变成了NFC的了。

去掉音符标记

1.先使用normalize函数都规范化成组合字符,再使用combining函数,此函数用来判断一个字符是否为一个组合字符。

import unicodedata
print()


s1 = 's\u00f1o'
print(s1)
t1 = unicodedata.normalize('NFD',s1)
result = ''.join(c for c in t1 if not unicodedata.combining(c))
print(result)
运行结果。已经把音符标记去掉。

2.使用字典映射

import unicodedata ,sys
cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode)
                         if unicodedata.combining(chr(c)))
print()


s1 = 's\u00f1o'
print(s1)
print(ascii(s1))
t1 = unicodedata.normalize('NFD',s1)
print(t1)
print(ascii(t1))
t2=t1.translate(cmb_chrs)
print(t2)
print(ascii(t2))


print(sys.maxunicode)
#print(cmb_chrs)

运行结果。print(sys.maxunicode)如果输出65535,代表当前系统的Unicode使用的具体编码方式为USC-2。如果输出的是1114111,那么代表是USC-4。注意,USC-2和USC-4只是规定了code point和文字的对应关系,但是并没有规定code point在计算机中如何存储。规定存储方式的称为UTF-8,UTF-16.

dict.fromkeys()构造出dict字典,key为不为组合字符的字符对应的code point对应的十进制数,vaule为none。先规范化,把所有字符转成组合字符。再通过translate映射,把所有这些组合字符给消掉。





测试代码(前面四个截图的代码):

import unicodedata
print()

s1 = 's\u00f1o'
print(s1)
print(ascii(s1))
s2 = 'sn\u0303o'
print(s2)
print(ascii(s2))
print(s1==s2)
print(len(s1))
print(len(s2))

print()

t1 = unicodedata.normalize('NFC',s1)
t2 = unicodedata.normalize('NFC',s2)

print(type(t1))
print(type(t2))
print(t1==t2)
print(len(t1))
print(len(t2))

print()

print(t1)
print(ascii(t1))
print(t2)
print(ascii(t2))


猜你喜欢

转载自blog.csdn.net/anlian523/article/details/80507646