我有一个关于等效 Unicode 字符串相等的问题,我已经给出了一些 Python 代码,但这可能是所有编程语言(如 C、C++、Perl 或 Java)的普遍问题。
我有一个字符串 u,它显示一个字形,即 05D1(希伯来字母BET)包含 05BC(希伯来点 DAGESH)和 05B8(希伯来点 QAMATS)
我有另一个字符串 v,它也显示完全相同的字形,即 05D1(希伯来语字母BET),包含 05B8(希伯来语点 QAMATS)和 05BC(希伯来语点 DAGESH)
差异在于合并或组合“POINTS”的顺序。许多其他语言和 Unicode 中的字母可以合并或与其他 POINT 组合来生成字形。
现在,u 和 v 实际上和视觉上是相同的字形,但不能在 Python 中简单地进行比较:
>>> u='\u05D1\u05BC\u05B8'
>>> v='\u05D1\u05B8\u05BC'
>>> u
'בָּ'
>>> v
'בָּ'
>>> u==u
True
>>> v==v
True
>>>
>>> u==v
False
>>> v==u
False
>>> u is v
False
>>>
当我用这些字形制作网页时,查看网页并搜索字形,即使 Mozilla FireFox 也将这两个视为不同,但 Google Chrome 将它们视为相同。显然,Python 和 FireFox 检查字节相等性,而 Chrome 不检查字节相等性,但以某种方式发现两者是相同的。
Python 中检查等效 Unicode 字符串是否相等的算法是什么?
最佳答案
Python 库 unicodedata 可以解决此类问题。
您将使用类似于以下的代码:
import unicodedata as ud
astr=u"\N{LATIN SMALL LETTER E}" + u"\N{COMBINING ACUTE ACCENT}"
combined_astr=ud.normalize('NFC',astr)
标准化为NFC
将某些组合标记序列放入明确定义的顺序中,
这可能会解决比较这些组合字符的问题。
其他规范化选项将丢弃组合字符,以便您
可以比较原始字符。
有关更多信息和示例,请参阅:
关于python - 等效 Unicode 字符串的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53179597/