在Django查询中处理外来字符

Bre*_*den 3 python django internationalization

我正在搜索从GeoNames.com导入的城市名称。一些城市的名称中包含国际字符。例如,“伊斯坦布尔”实际上是数据库中的“伊斯坦布尔”。

人们搜索“伊斯坦布尔”时,伊斯坦布尔不会出现。

有没有一种方法可以向搜索添加过滤器或解码器,使之知道呢?stanbul = Istanbul

当前是:

cities = City.objects.filter(name__icontains=query)
Run Code Online (Sandbox Code Playgroud)

bee*_*jay 5

Unidecode将帮助您解决此问题的某种形式。Unidecode会将非ASCII字符转换为ASCII,例如:

>>> from unidecode import unidecode
>>> unidecode(u"?stanbul")
'Istanbul'
Run Code Online (Sandbox Code Playgroud)

您可以通过分解unicode字符并删除组合的变音符号来实现类似的效果。这种技术的问题在于某些字符不可分解。因此,尽管“ö”将分解为“ o”和变音符,“?” (左冲程)将保持不变。Unidecode成功翻译了“?” 到“ L”。

但是Undeicode并不能解决您的所有问题。可以使用不同的名称来了解城市,也可以用不同的名称来书写。例如,在美国,我们称中国首都为“北京”,但我们以前称其为“北京”(瑞典语中仍称其为“北京”),并将其名称翻译unidecode为其他名称:

>>> unidecode(u"\u5317\u4EB0")
'Bei Jing '
Run Code Online (Sandbox Code Playgroud)

最好的解决方案是拥有特定于语言的名称列表,而不要使用城市的实际名称。