Python如何用十六进制字符解码unicode

标签 python utf-8 python-2.x

我从网络抓取脚本中提取了一个字符串,如下所示:

u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'

我想用 utf-8 解码 u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'。 用http://ddecode.com/hexdecoder/ , 我可以看到结果是 '【中字】'

我尝试使用以下语法但失败了。

msg = u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'
result = msg.decode('utf8')

错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordi
nal not in range(128)

请问如何正确解码字符串?

感谢您的帮助。

最佳答案

问题

msg = u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91'
result = msg.decode('utf8')

是您正在尝试解码 Unicode。那真的没有意义。您可以将 Unicode 编码为某种类型的编码,或者您可以将字节字符串解码为 Unicode。

当你这样做的时候

msg.decode('utf8')

Python 2 认为 msg 是 Unicode。它知道它无法解码 Unicode,因此它“有帮助地”假设您要使用默认的 ASCII 编解码器对 msg 进行编码,以便可以使用 UTF-8 编解码器将该转换的结果解码为 Unicode . Python 3 的行为更加明智:该代码将简单地以

失败
AttributeError: 'str' object has no attribute 'decode'

kennytm的回答中给出的技术:

msg.encode('latin1').decode('utf-8')

之所以有效,是因为小于 256 的 Unicode 代码点直接对应于 Latin1 中的字符编码(又名 ISO 8859-1)。

下面是一些说明这一点的 Python 2 代码:

for i in xrange(256):
    lat = chr(i)
    uni = unichr(i)
    assert lat == uni.encode('latin1')
    assert lat.decode('latin1') == uni

下面是等效的 Python 3 代码:

for i in range(256):
    lat = bytes([i])
    uni = chr(i)
    assert lat == uni.encode('latin1')
    assert lat.decode('latin1') == uni

您可能会发现这篇文章很有帮助:Pragmatic Unicode ,由 SO 资深人士 Ned Batchelder 撰写。

除非你被迫使用 Python 2,否则我强烈建议你切换到 Python 3。它会大大减轻处理 Unicode 的痛苦。

关于Python如何用十六进制字符解码unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015477/

相关文章:

python - 如何绕过 python 请求 SSL 和代理错误?

python - Sublime Text 3、Python 3 和 UTF-8 彼此不喜欢

python - 倒数

Python 3.x : AttributeError: 'str' object has no attribute 'append'

string - 在字符串中搜索一组分隔符中的第一个分隔符的有效方法是什么?

python - tarfile.open() 未提取到正确的目录路径

python - 对于基本总和计算,Cython 并不比 Python 快多少

python - 如何在我的 docker 镜像中安装 python-tk

python - 如何从Python集合中有效地循环正则表达式搜索

mysql - Delphi 5,如何从 MySQL 的 tis620 字段中检索数据?