等效Unicode字符串的相等性

时间:2018-11-06 11:58:39

标签: python unicode character-encoding string algorithm

我有一个关于等价Unicode字符串的相等性的问题,并且给出了一些Python代码,但这可能是所有编程语言(如C,C ++,Perl或Java)的一个普遍问题。

我有一个字符串u,它显示一个字形,它是包含05BC(希伯来语点数)和05B8(希伯来语点数)的05D1(希伯来语投注)

我还有另一个字符串v,它也显示完全相同的字形,即05D1(希伯来字母下注)并结合了05B8(希伯来点卡塔姆)和05BC(希伯来点数)

区别在于合并或组合“要点”的顺序。 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都将这两个字形视为Distinct,但是Google Chrome将它们视为相同。显然,Python和FireFox检查字节是否相等,而Chrome并不检查字节是否相等,而是以某种方式弄清楚两者是否相同。

在Python中检查等效Unicode字符串是否相等的算法是什么?

1 个答案:

答案 0 :(得分:4)

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会将组合标记的某些序列置于定义明确的顺序中, 这可能会解决比较这些组成字符的问题。 其他规范化选项将舍弃组合字符,以便您 可能会比较原始字符。

有关更多信息和示例,请参见: