等价Unicode字符串的相等性

2024-05-19 13:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于等价的Unicode字符串相等的问题,我已经给出了一些Python代码,但是对于所有的编程语言,例如C、C++、Perl或java,都可能是一个普遍的问题。p>

我有一个字符串u,它显示一个glyph,它是05D1(希伯来语字母BET),包含05BC(希伯来语点DAGESH)和05B8(希伯来语点QAMATS)

我有另一个字符串v,它也显示完全相同的glyph,它是05D1(希伯来语字母BET),包含05B8(希伯来语点QAMATS)和05BC(希伯来语点DAGESH)

不同之处在于合并或组合“点”的顺序。Unicode中的许多其他语言和字母可以合并或与其他点组合以生成glyph

现在,u和v实际上在视觉上是相同的glyph,但在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字符串相等性的算法是什么


Tags: 字符串falsetrue标志字母unicode符号等价
1条回答
网友
1楼 · 发布于 2024-05-19 13:33:13

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

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

相关问题 更多 >