规范Unicode
在Python中是否有一个标准的方法来标准化unicodestring,以便它只理解可以用来表示它的最简单的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']
当然,我可以遍历所有的字符,并进行手动replace等,但效率不高,我敢肯定,我会错过一半的特殊情况,并犯错误。
unicodedata
模块提供了一个.normalize()
函数 ,你想规范化为NFC格式:
>>> unicodedata.normalize('NFC', u'\u0061\u0301') u'\xe1' >>> unicodedata.normalize('NFD', u'\u00e1') u'a\u0301'
NFC或“正常forms组成”返回组成字符,NFD,“正常forms分解”给你分解,组合字符。
额外的NFKC和NFKDforms处理兼容性代码点; 例如,U + 2160(ROMAN NUMERAL ONE)与U + 0049(拉丁大写字母I)实际上是一样的,但在Unicode标准中存在,以便与分别对待它们的编码保持兼容。 使用NFKC或NFKDforms,除了编写或分解字符外,还将用其规范formsreplace所有“兼容性”字符:
>>> unicodedata.normalize('NFC', u'\u2167') # roman numeral VIII u'\u2167' >>> unicodedata.normalize('NFKC', u'\u2167') # roman numeral VIII u'VIII'
请注意,不能保证合成和分解的forms是交stream的; 将组合字符规范化为NFCforms,然后将结果转换回NFDforms并不总是导致相同的字符序列。 Unicode标准维护一个例外列表 ; 这个列表中的字符是可组合的,但不能分解回到它们的组合forms,出于各种原因。 另请参阅组合排除表上的文档。
是的,有 。
unicodedata.normalize(form, unistr)
您需要select四种标准化forms之一 。