如果我混合了阿拉伯语和拉丁字母的字符串,结果可能会很奇怪。
例如,字符串可以看起来像这样:(2)بسكويت或者像这样:(2(بسكويت
唯一的区别是第二个中从右到左的标记(这是一个不可见的 unicode 字符 U+200F(。但是,如果只有一个从右到左的标记或有多个标记,则不会有任何区别。也可能有正常的从右到左或嵌入的从右到左(U+200F 或 U+202B(
当我比较两个字符串时,我只知道它们是否相等。是否也有可能知道即使字符串不同,可见结果是否相同?
是的,但这可能很困难,这完全取决于您拥有什么文本。
模块unicodedata
将为您提供数据。就个人而言,我会从规范化开始,例如 NFKC
或 NFC
,具体取决于您的输入。
s = unicodedata.normalize(form, s)
然后我会过滤我们不需要的字符。
s = [c for c in s if not unicodedata.category(c).startswith('C')]
您将在 http://www.unicode.org/reports/tr44/tr44-6.html#Property_Values 中找到可能的常规类别。以 C 开头的类别是控件/格式设置。但您可能还需要包含其他空格字符,具体取决于用例。也许您还需要进行其他"规范化",将所有空格合并为一个 U+0020。
概括起来非常困难(但第一次规范化(,因为每个 unicode 代码点都可能具有一定的语义意义。因此,您应该检查可以丢弃的内容以及必须维护的内容。