我正在尝试从网站获取带有特殊字符的文本,因此 Python 返回的字符串充满了“\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()
会将非 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>'
推荐阅读:
关于Python 得到错误的 UTF-8 字符编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34695154/