Python 获取错误的 UTF-8 字符编码?

Python gets the wrong encoding for UTF-8 characters?

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

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

网页第<h1>层的行应包含字母“Þ”,根据http://www.fileformat.info/info/charset/UTF-8/list.htm

其字节编号为C39E,Unicode代码为DE

相反,我得到

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

将字节数一分为二,这样当将行写入文件然后使用 Unicode 编码打开它时,我得到的是“Þ”而不是“Þ”。

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

这是 U+00DE 的正确 UTF-8 byte 编码,它需要两个字节来表示它(\xc3\x9e),但是您需要将其解码为 Unicode 才能查看 Unicode 代码点。在 Python 3 ascii() 中将显示 non-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 代码点 < U+0100 的 Unicode 字符串中的 转义码 \u017E 是代码点 < U+10000:

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

推荐阅读: