我正在搜索从 GeoNames.com 导入的城市名称。一些城市的名称中带有国际字符。例如,“Istanbul”在数据库中实际上是“İstanbul”。
当人们搜索“ Istanbul 尔”时, Istanbul 尔不会出现。
有没有一种方法可以将过滤器或解码器添加到知道 İstanbul = Istanbul 的搜索中
目前,它是:
cities = City.objects.filter(name__icontains=query)
最佳答案
Unidecode将帮助您解决此问题的某种形式。 Unidecode 会将非 ascii 字符转换为 ascii,例如:
>>> from unidecode import unidecode
>>> unidecode(u"İstanbul")
'Istanbul'
您可以通过分解 unicode 字符并删除组合变音符号来实现类似的效果。这种技术的问题是某些字符不可分解。因此,虽然“ö”将分解为“o”和变音符号,但“Ł”(左笔画)将保持不变。 Unidecode 成功地将“Ł”翻译成“L”。
但 Undeicode 并不能解决您所有的问题;城市可以有不同的名字,或者这些名字可以有不同的写法。比如在美国我们称中国的首都为“Beijing”,但我们习惯称它为“Peking”(瑞典语仍然叫“Peking”),将它的名字翻译成unidecode
给了我们别的东西:
>>> unidecode(u"\u5317\u4EB0")
'Bei Jing '
最好的解决方案是使用特定语言的名称列表,而不是使用城市的实际名称。
关于python - 处理django查询中的外来字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8967789/