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'>
如何将其解码为真正的字符串?? ???
如果您打印了字符串的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.