3

在德语中,eszett 字母“ß”相当于“ss”。

Python 允许进行语言环境感知的字符串比较,如下所示:

>>> foo = u'strasse'
>>> bar = u'stra\xdfe'
>>> print(bar.encode('utf-8'))
straße
>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
'de_DE'
>>> locale.strcoll(foo, bar)
-12
>>> locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
'de_DE.utf8'
>>> locale.strcoll(foo, bar)
-28

我如何比较 foo 和 bar 并知道它们实际上是等价的?

(为什么 locale.strcoll(foo, bar) 在语言环境设置为德语时不返回 0?)

澄清一下,我对通用解决方案感兴趣,而不是特定于德语。Java 对区域感知字符串比较的解决方案是它的java.text.Collat​​or类。C# 的解决方案是它的System.Globalization.CultureInfo类。Python有这样的东西吗?(如果不是,不应该吗?)

出于好奇,这里有一个在 Java 中使用 Collat​​or 的示例:

import java.text.Collator;
import java.util.Locale;

public class CompareStrings {
    public static void main(String[] args) {
        Collator coll = Collator.getInstance(Locale.GERMAN);
        coll.setStrength(Collator.PRIMARY);
        if (coll.compare("strasse", "straße") == 0) {
            System.out.println("Strings are equivalent");
        } else {
            System.out.println("Strings are not equivalent");
        }
    }
}

输出是“字符串是等价的”。

4

2 回答 2

1

使用unidecode模块。

from unidecode import unidecode
print unidecode(u'stra\xdfe')

输出:

strasse

这种从一种文字到另一种文字的转换过程称为音译

于 2014-11-10T22:26:45.490 回答
0

如果您不想要外部模块,那么这个 hack 怎么样:

def isEquivalent(str1, str2):
    return ( locale.strxfrm(str2[:-1]) < locale.strxfrm(str1) <= locale.strxfrm(str2) < locale.strxfrm(str1+"0") 
    or 
    locale.strxfrm(str1[:-1]) < locale.strxfrm(str2) <= locale.strxfrm(str1) < locale.strxfrm(str2+"0") )

这也将重音或变音符号视为等效。

于 2015-01-13T06:51:25.287 回答