【问题标题】:Python gets the wrong encoding for UTF-8 characters?Python 获得了错误的 UTF-8 字符编码?
【发布时间】:2026-01-27 04:30:01
【问题描述】:

我正在尝试从网站获取带有特殊字符的文本,因此 Python 返回的字符串中充满了“\x”字符。 但是,似乎编码是错误的。 例如,在获取时:

th =urllib2.urlopen('http://norse.ulver.com/dct/zoega/th.html')

网页<h1>级别的行应包含字母“Þ”,其字节数为C39E,Unicode代码DE根据http://www.fileformat.info/info/charset/UTF-8/list.htm

相反,我得到了

'<h1>\xc3\x9e</h1>'

将字节数分成两部分,因此在将行写入文件然后使用 Unicode 编码打开它时,我得到的是“Þ”而不是“Þ”。

如何强制 Python 编码 \uC39E\xde 这样的字符,而不是 \xc3\x9e

【问题讨论】:

  • 听起来一切正常,但搞混了。不用担心;这是相当普遍的。不要使用 Latin-1 或代码页 1251 工具来检查 UTF-8(或继续;但要了解您正在查看的内容)。
  • 术语更正:0xC3 0x9E是U+00DE的UTF-8 编码

标签: python unicode escaping urllib2


【解决方案1】:

这是 U+00DE 的正确 UTF-8 byte 编码,它需要两个字节来表示(\xc3\x9e),但您需要将其解码为 Unicode 才能看到Unicode 代码点。在 Python 3 中,ascii() 会将非 ASCII 码点显示为转义码:

>>> print(ascii(b'<h1>\xc3\x9e</h1>'.decode('utf8')))
'<h1>\xde</h1>'

以上是显示正确 Unicode 代码点的 Unicode 字符串。在 Python 3 中显示它:

>>> b'<h1>\xc3\x9e</h1>'.decode('utf8')
'<h1>Þ</h1>'

如果您使用错误的编码进行解码,您将获得不同的 Unicode 代码点。在这种情况下,U+00C3 和 U+017E。 \xc3 是 Unicode 字符串中的 转义码,用于 Unicode 代码点 \u017E 是用于代码点

>>> print(ascii(b'<h1>\xc3\x9e</h1>'.decode('cp1252')))
'<h1>\xc3\u017e</h1>'
>>> b'<h1>\xc3\x9e</h1>'.decode('cp1252')
'<h1>Þ</h1>'

推荐阅读:

【讨论】: