相同的单词,但不同的unicode字符

时间:2017-02-01 08:59:16

标签: python mongodb unicode

我在越南的餐馆使用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”与不同的代码相匹配?。

1 个答案:

答案 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。