我在越南的餐馆使用Python在Windows上建立了一个回答应用程序的问题。要写越南语字符,我需要使用Unicode 首先,我从TripAdvisor网站克隆数据,使用HTML charset = utf-8并构建我的Mongo数据库。 TripAdvisor中一个名为“đànẵng”的城市有一个代码:
>>> print repr("đà nẵng") # from tripadvisor website
>>> '\xc4\x91a\xcc\x80 n\xc4\x83\xcc\x83ng'
但是,当我从Firefox的地址栏查询时,城市“đànẵng”有不同的代码:
>>> print repr("đà nẵng") # Firefox's address bar
>>> '\xc4\x91\xc3\xa0 n\xe1\xba\xb5ng'
这就是我无法在我的数据库中找到该城市的原因。我尝试在notepad ++上写这个城市名,并得到与使用Firefox的地址栏
相同的结果>>> print repr("đà nẵng") # notepad++ using 'Encoding UTF-8'
>>> '\xc4\x91\xc3\xa0 n\xe1\xba\xb5ng'
有没有办法在两种代码之间进行转换?
或者有没有办法在这种情况下将城市名称“đànẵng”与不同的代码相匹配?。
答案 0 :(得分:5)
您遇到的问题是,unicode允许多种方式组成相同的符号。 Python模块unicodedata
提供了一个函数normalize
,允许您将unicode表示转换为固定的form (例如NFC)
from unicodedata import normalize
S1 = b'\xc4\x83\xcc\x83'.decode('UTF-8')
S2 = b'\xe1\xba\xb5'.decode('UTF-8')
print(normalize('NFC', S1).encode('UTF-8'))
print(normalize('NFC', S2).encode('UTF-8'))
在您的示例tripadvisor中以NFD形式显示,而记事本使用NFC。