在德语中,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设置为德语时,为什么locale.strcoll(foo,bar)不返回0?)
为了澄清一下,我对一般的解决方案感兴趣,而不是德国的特定解决方案。 Java的区域设置感知字符串比较解决方案是它的java.text.Collator类。 C#的解决方案是它的System.Globalization.CultureInfo类。 Python有这样的东西吗? (如果没有,不应该吗?)
对于好奇,这是在Java中使用Collator的一个例子:
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");
}
}
}
输出是“字符串是等价的”。
答案 0 :(得分:1)
使用unidecode模块。
from unidecode import unidecode
print unidecode(u'stra\xdfe')
输出:
strasse
从一个脚本转换到另一个脚本的过程称为transliteration。
答案 1 :(得分:0)
如果你不想要外部模块,那么黑客攻击:
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") )
这也认为口音或变音符号是等效的。