如何用python解码utf-8的字符串代表?

arm*_*ong 2 python encode decode utf-8

我有一个像这样的unicode:

\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7
Run Code Online (Sandbox Code Playgroud)

我知道它是用bytes其编码的字符串代表utf-8

请注意,字符串\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7本身是<type 'unicode'>

如何将其解码为真正的字符串?? ??

Mar*_*ers 8

如果您打印了字符串的repr()输出,unicode那么您似乎有一个Mojibake,使用错误的编码解码字节数据.

首先编码回字节,然后使用正确的编解码器进行解码.这可能像编码Latin-1一样简单:

unicode_string.encode('latin1').decode('utf8')
Run Code Online (Sandbox Code Playgroud)

这取决于如何应用不正确的解码.如果使用Windows代码页(如CP1252),如果CP1252范围之外的UTF-8字节无论如何都被强制解码,您最终可能无法将可编码的Unicode数据反馈回CP1252.

修复此类错误的最佳方法是使用该ftfy,该知道如何处理各种编解码器的强制解码Mojibake文本.

对于您的小样本,Latin-1 似乎工作得很好:

>>> unicode_string = u'\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7'
>>> print unicode_string.encode('latin1').decode('utf8')
?? ??
>>> import ftfy
>>> print ftfy.fix_text(unicode_string)
?? ??
Run Code Online (Sandbox Code Playgroud)

如果你有文字字符\,x后跟两个数字,你有另一层编码,其中每个字节被4个字符替换.您必须首先通过要求Python使用string_escape编解码器解释转义来"解码"那些实际字节:

>>> unicode_string = ur'\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7'
>>> unicode_string
u'\\xE5\\xB1\\xB1\\xE4\\xB8\\x9C \\xE6\\x97\\xA5\\xE7\\x85\\xA7'
>>> print unicode_string.decode('string_escape').decode('utf8')
?? ??
Run Code Online (Sandbox Code Playgroud)

'string_escape' 是一个只有Python 2的编解码器,它产生一个字节串,因此可以安全地将其解码为UTF-8.