有没有办法比较阿拉伯字符而不考虑它们的初始/中间/最终形式?

时间:2015-05-05 01:04:43

标签: python string arabic

在拉丁文字中,字母有大写和小写形式。在Python中,如果要比较两个字符串而不考虑它们的情况,可以使用'string'.upper()'string'.lower()

将它们转换为相同的大小写

在阿拉伯语脚本中,字母可以包含初始,中间或最终形式。是否有类似的方法来比较阿拉伯字符的字符串而不关心字母所在的形式?

1 个答案:

答案 0 :(得分:6)

这有两个部分,适用于所有语言: *

  • 您的字符串必须符合NFKD规范化,以保证两个相等的字符串具有相同的代码单元。
  • 要忽略比较两个NFKD字符串的情况,请使用Unicode大小写折叠算法。

在两者之间,它处理英语大写和小写,阿拉伯语初始/中间/最终(加上孤立),德语ßssé作为单个代码点与e\N{COMBINING ACUTE ACCENT},中国旋转的角色,日本的半角假名,以及可能是你没有想过的各种其他东西。

在Python中,看起来像这样:

>>> s1 = 'ﻧ'
>>> s2 = 'ﻨ'
>>> unicodedata.normalize('NFKD', s1).casefold() == unicodedata.normalize('NFKD', s2)
True

请注意,在Python 3.3之前未添加casefold。如果你使用的是早期版本的Python,那么PyPI就有实现;使用它们应该类似于使用3.3+内置。

如果您对 这对阿拉伯语有用感兴趣,而不仅仅是因为它适用于阿拉伯语以及其他所有语言,那么您已经在unicode.org上阅读了算法和表格。 。 IIRC,建议这样做的W3C文件解释了为什么它使用阿拉伯语作为例子。我相信这是因为Unicode将初始,中间,最终和隔离视为同一字符的兼容性等效表示形式,因此对分解进行规范化可以有效地提供隔离形式以及案例折叠可以跳过或转换的修饰符,即使直接在案例折叠上组合字符只返回字符本身。

*在少数情况下,两种不同的语言或文化使用相同的脚本,但具有不同的案例折叠规则;在这种情况下,您需要特定于语言环境的casefolding,Python不包含。但这不应该与此相关。