Unicode 规范化
- 2024-12-20 08:38:00
- admin 原创
- 68
问题描述:
在 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']
当然,我可以遍历所有字符并进行手动替换等,但效率不高,而且我很确定我会错过一半的特殊情况并犯错误。
解决方案 1:
该unicodedata
模块提供了一个.normalize()
函数,您可以将其规范化为 NFC 格式。使用相同的示例U+0061 LATIN SMALL LETTER
-您使用的U+0301 A COMBINING ACUTE ACCENT
组合和U+00E1 LATIN SMALL LETTER A WITH ACUTE
代码点:
>>> print(ascii(unicodedata.normalize('NFC', '/u0061/u0301')))
'xe1'
>>> print(ascii(unicodedata.normalize('NFD', '/u00e1')))
'a/u0301'
(我在这里使用该ascii()
函数来确保使用转义语法打印非 ASCII 代码点,从而使差异清晰可见)。
NFC,即“Normal Form Composed”返回组合字符,NFD,即“Normal Form Decomposed”返回分解的组合字符。
附加的 NFKC 和 NFKD 形式处理兼容性代码点;例如,U+2160 ROMAN NUMERAL ONE
实际上与 Unicode 标准中存在相同的东西U+0049 LATIN CAPITAL LETTER I
,但是为了与单独处理它们的编码保持兼容。使用 NFKC 或 NFKD 形式,除了组合或分解字符外,还将用其规范形式替换所有“兼容”字符。
下面是一个使用代码点的示例;使用 NFKC 形式将其替换为 ASCII和字符U+2167 ROMAN NUMERAL EIGHT
序列:V
`I`
>>> unicodedata.normalize('NFC', '/u2167')
'Ⅷ'
>>> unicodedata.normalize('NFKC', '/u2167')
'VIII'
请注意,无法保证组合形式和分解形式是可交换的;将组合字符规范化为 NFC 形式,然后将结果转换回 NFD 形式并不总是会产生相同的字符序列。Unicode 标准维护了一个例外列表;由于各种原因,此列表中的字符可组合,但不能分解回其组合形式。另请参阅有关组合排除表的文档。
解决方案 2:
是的。
unicodedata.normalize(form, unistr)
您需要选择四种规范化形式中的一种。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件