python - 等效 Unicode 字符串的相等性

标签 python unicode character-encoding string algorithm

我有一个关于等效 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/

相关文章:

string - 将 utf-8 编码的字符串从字节转换为字符时,计算机如何知道字符在哪里结束?

python - 如果一行满足条件,则从 pandas 数据框中删除级别及其所有行

python - 如何在 PyO3 中实现 python 运算符

java - DB2 使用 ALT_COLLATE UNICODE 在非 unicode 数据库上插入 UTF-8 字符

基于 Sublime Text 3 的 Python 2.7 不打印 '\uFFFD' 字符

php - 在 MySQL 数据库中保存口音

python - 如何将字符串列表转换为正确的 Python 类型?

python - random.randint 函数没有按照我希望的方式工作

Python 统一码编码错误 : 'ascii' codec can't encode character in position 0: ordinal not in range(128)

java - UnmappableCharacterException 是什么意思?