Python 得到错误的 UTF-8 字符编码?

标签 python unicode escaping urllib2

我正在尝试从网站获取带有特殊字符的文本,因此 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/

相关文章:

python - 用通过比较另一列的数据获得的数据填充一列

perl - Perl 中字符串的长度与字符编码无关

unicode - 经典 ASP : How to write unicode string data in classic ASP?

delphi - CharInSet 不适用于非英文字母?

bash - zsh 或 bash 是否有方便英文文本的引号?

java - 如何在模式编译时转义方括号?

java - 用于文件名的字符串具有转义字符 "\"。我该如何解决这个问题?

Python 正则表达式模式 findall

python - 使用 numpy lstsq 计算残差

python - 如何使用conda安装python3.9?