为了账号安全,请及时绑定邮箱和手机立即绑定

为什么字符串中的和音符去掉后变成了对应的ASCII字符?

为什么字符串中的和音符去掉后变成了对应的ASCII字符?

慕田峪9158850 2018-09-02 12:11:52
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]

你会发现,虽然 ab 打印出来是一样的,内部的编码却不一样。原因在于 unicode.normalize 把带音调的字符都拆开了。而 cmb_chrs 中记录了音调符号的 Unicode 码,执行 b.translate 后,音调自然就没有了。


查看完整回答
反对 回复 2018-09-02
  • 1 回答
  • 0 关注
  • 681 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信