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>'
推荐阅读:
我正在尝试从网站获取带有特殊字符的文本,因此字符串 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
相反,我得到
'<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>'
推荐阅读: