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

时间:2016-10-13 08:04:01

标签: 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)

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

  1. 也许您应该修复抓取脚本,Unicode字符串应该包含u'【中字】'u'\u3010\u4e2d\u5b57\u3011'),而不是原始的UTF-8字节。

  2. 要将msg转换为正确的编码,首先需要将错误的Unicode字符串转回字节字符串(将其编码为Latin-1),然后解码它作为UTF-8:

    >>> print msg.encode('latin1').decode('utf-8')
    【中字】
    

答案 1 :(得分:4)

的问题
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变得更加痛苦。

答案 2 :(得分:1)

将msg保留为字符串而不是unicode。

$ $myPinValue = $(cat /sys/class/gpio/gpio4/value)