python3-cookbook 中有一个这样的例子:>>> import unicodedata>>> import sys>>> cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode)... if unicodedata.combining(chr(c)))>>> a = 'pýtĥöñ is awesome\n'>>> b = unicodedata.normalize('NFD', a)>>> b'pýtĥöñ is awesome\n'>>> b.translate(cmb_chrs)'python is awesome\n'>>>cmb_chrs 每个键对应的值都是 None, 那么为什么在执行 b.translate(cmb_chrs) 后可以得到字符串 python is awesome\n ?
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
如果你执行:
print([ord(x) for x in a]) # [112, 253, 116, 293, 246, 241, 32, 105, 115, 32, 97, 119, 101, 115, 111, 109, 101, 10] print([ord(x) for x in b]) # [112, 121, 769, 116, 104, 770, 111, 776, 110, 771, 32, 105, 115, 32, 97, 119, 101, 115, 111, 109, 101, 10]
你会发现,虽然 a
、b
打印出来是一样的,内部的编码却不一样。原因在于 unicode.normalize
把带音调的字符都拆开了。而 cmb_chrs
中记录了音调符号的 Unicode 码,执行 b.translate
后,音调自然就没有了。
添加回答
举报
0/150
提交
取消