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

规范化Unicode

规范化Unicode

30秒到达战场 2019-10-18 15:00:13
在Python中,是否有一种标准化的方法来标准化unicode字符串,以便它仅包含可用于表示它的最简单的unicode实体?我的意思是,一些东西,想翻译的顺序['LATIN SMALL LETTER A', 'COMBINING ACUTE ACCENT']来['LATIN SMALL LETTER A WITH ACUTE']?查看问题出在哪里:>>> import unicodedata>>> char = "á">>> len(char)1>>> [ unicodedata.name(c) for c in char ]['LATIN SMALL LETTER A WITH ACUTE']但现在:>>> char = "á">>> len(char)2>>> [ unicodedata.name(c) for c in char ]['LATIN SMALL LETTER A', 'COMBINING ACUTE ACCENT']当然,我可以遍历所有字符并进行手动替换等,但是效率不高,我敢肯定我会错过一半的特殊情况,并且会犯错误。
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

该unicodedata模块提供一个.normalize()功能,您要标准化为NFC格式:


>>> unicodedata.normalize('NFC', u'\u0061\u0301')

u'\xe1'

>>> unicodedata.normalize('NFD', u'\u00e1')

u'a\u0301'

NFC或“普通形式组合”返回组成的字符,NFD,“普通形式分解”可为您提供分解的组合字符。


附加的NFKC和NFKD表格处理兼容性代码点。例如,U + 2160(罗马数字ONE)实际上与U + 0049(拉丁字母大写字母I)相同,但是在Unicode标准中存在,以保持与单独处理它们的编码的兼容性。使用NFKC或NFKD格式,除了组成或分解字符外,还将所有“兼容”字符替换为其规范形式:


>>> unicodedata.normalize('NFC', u'\u2167')  # roman numeral VIII

u'\u2167'

>>> unicodedata.normalize('NFKC', u'\u2167') # roman numeral VIII

u'VIII'

注意,不能保证组合形式和分解形式是可交流的。将组合字符归一化为NFC形式,然后将结果转换回NFD形式并不总是产生相同的字符序列。Unicode标准维护例外列表 ; 出于各种原因,此列表中的字符是可组合的,但不能分解为它们的组合形式。另请参阅成分排除表中的文档。


查看完整回答
反对 回复 2019-10-18
?
翻阅古今

TA贡献1780条经验 获得超5个赞

是的,有。


unicodedata.normalize(form, unistr)

您需要选择四种规范化形式之一。


查看完整回答
反对 回复 2019-10-18
  • 2 回答
  • 0 关注
  • 566 浏览
慕课专栏
更多

添加回答

举报

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