【问题标题】:Same word but different unicode characters相同的单词但不同的 unicode 字符
【发布时间】:2017-02-01 08:59:16
【问题描述】:

我在 Windows 上使用 Python 构建了一个关于越南餐馆的问答应用程序。要编写越南语字符,我需要使用 Unicode。
首先,我从使用 HTML charset=utf-8 的 TripAdvisor 网站克隆数据并构建我的 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”与不同的代码匹配?

【问题讨论】:

  • 试试 str("đà nẵng", 'utf-8')
  • @Nether 1) 这不是问题 2) 只有在您的终端是 UTF-8 或您的代码编码是 UTF-8 时才会解码

标签: python mongodb unicode


【解决方案1】:

您遇到的问题是,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'))

在您以 NFD 形式显示的示例tripadvisor 中,而记事本使用 NFC。

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2018-05-27
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2016-01-22
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多