有没有办法在不考虑 initial/medial/final 形式的情况下比较阿拉伯字符?
Is there a way to compare Arabic characters without regard to their initial/medial/final form?
在拉丁文字中,字母有大写和小写形式。在 Python 中,如果你想比较两个字符串而不考虑它们的大小写,你可以使用 'string'.upper()
或 'string'.lower()
将它们转换为相同的大小写
在阿拉伯文字中,字母可以有首字母、中字母或词尾形式。有没有类似的方法来比较阿拉伯字符的字符串而不关心字母的形式?
这有两个部分,应该适用于所有语言:*
- 您的字符串必须进入 NFKD 规范化以保证两个相同的字符串具有相同的代码单元。
- 要在比较两个 NFKD 字符串时忽略大小写,请使用 Unicode 大小写折叠算法。
在两者之间,这将处理英语大小写、阿拉伯语 initial/medial/final(加隔离)、德语 ß
与 ss
、é
作为单个代码点与 e\N{COMBINING ACUTE ACCENT}
、中文旋转字符、日语半角假名,以及可能您没有想到的各种其他内容。
在 Python 中,它看起来像这样:
>>> s1 = 'ﻧ'
>>> s2 = 'ﻨ'
>>> unicodedata.normalize('NFKD', s1).casefold() == unicodedata.normalize('NFKD', s2)
True
请注意 casefold
直到 Python 3.3 才添加。如果您使用的是 Python 的早期版本,PyPI 上有实现;使用它们应该类似于使用 3.3+ 内置。
如果您对 如何 这适用于阿拉伯语感兴趣,而不仅仅是它适用于阿拉伯语和其他所有语言,您已经阅读了算法和unicode.org 的表格。 IIRC,建议这样做的 W3C 文档解释了为什么它以阿拉伯语为例。我相信这是因为 Unicode 将初始、中间、最终和隔离视为相同字符的兼容性等效表示形式,因此规范化为分解为您有效地提供了隔离形式加上一个修饰符,即使直接在 casefolding 上, casefolding 也可以跳过或转换组合字符只是 returns 字符本身。
* 在某些情况下,两种不同的语言或文化使用相同的文字,但有不同的大小写规则;在这种情况下,您需要特定于语言环境的 casefolding,Python 不包括在内。但这在这里不应该是相关的。
在拉丁文字中,字母有大写和小写形式。在 Python 中,如果你想比较两个字符串而不考虑它们的大小写,你可以使用 'string'.upper()
或 'string'.lower()
在阿拉伯文字中,字母可以有首字母、中字母或词尾形式。有没有类似的方法来比较阿拉伯字符的字符串而不关心字母的形式?
这有两个部分,应该适用于所有语言:*
- 您的字符串必须进入 NFKD 规范化以保证两个相同的字符串具有相同的代码单元。
- 要在比较两个 NFKD 字符串时忽略大小写,请使用 Unicode 大小写折叠算法。
在两者之间,这将处理英语大小写、阿拉伯语 initial/medial/final(加隔离)、德语 ß
与 ss
、é
作为单个代码点与 e\N{COMBINING ACUTE ACCENT}
、中文旋转字符、日语半角假名,以及可能您没有想到的各种其他内容。
在 Python 中,它看起来像这样:
>>> s1 = 'ﻧ'
>>> s2 = 'ﻨ'
>>> unicodedata.normalize('NFKD', s1).casefold() == unicodedata.normalize('NFKD', s2)
True
请注意 casefold
直到 Python 3.3 才添加。如果您使用的是 Python 的早期版本,PyPI 上有实现;使用它们应该类似于使用 3.3+ 内置。
如果您对 如何 这适用于阿拉伯语感兴趣,而不仅仅是它适用于阿拉伯语和其他所有语言,您已经阅读了算法和unicode.org 的表格。 IIRC,建议这样做的 W3C 文档解释了为什么它以阿拉伯语为例。我相信这是因为 Unicode 将初始、中间、最终和隔离视为相同字符的兼容性等效表示形式,因此规范化为分解为您有效地提供了隔离形式加上一个修饰符,即使直接在 casefolding 上, casefolding 也可以跳过或转换组合字符只是 returns 字符本身。
* 在某些情况下,两种不同的语言或文化使用相同的文字,但有不同的大小写规则;在这种情况下,您需要特定于语言环境的 casefolding,Python 不包括在内。但这在这里不应该是相关的。