2016-08-19 63 views
2

我有一个的Unicode这样的:如何用python解码代表utf-8的字符串?

\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7 

我知道这是代表bytes串被编码与utf-8

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

如何将其解码为真正的字符串山东 日照

回答

6

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

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

unicode_string.encode('latin1').decode('utf8') 

这取决于如何应用不正确的解码。如果使用Windows代码页(如CP1252),那么如果CP1252范围外的UTF-8字节无论如何都被强制解码,则最终可能会得到实际上不能编码回CP1252的Unicode数据。

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

为了您的小样本,拉丁语1 出现来就好了工作:如果你有字面字符\x,后面两个数字

>>> 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) 
山东 日照 

,你有编码的另一层其中每个字节由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') 
山东 日照 

'string_escape'是产生一个字节串Python的2只编解码器,因此它是安全的之后解码为UTF-8。

+0

谢谢,Martijn,如果我打印包含字符串的字典,它会显示'{u'qualifier':u'name',u'timestamp':u'1462275769186',u'value':u'\ \ xE5 \\ x8E \\ x9F \\ xE6 \\ x9D \\ xA5 \\ xE6 \\ x98 \\ xAFolivia \\ xE5 \\ x95 \\ x8A',u'columnFamily':u'interActive',u'type ':u'Put',u'row':u'1771897264'} '和print m.get('value')。encode('latin1')。decode('utf8')'仍然打印'\ xE5 \ x8E \ x9F ...' – armnotstrong

+0

@armnotstrong:您没有字节。你有*文字*反斜杠,'x'字符和十六进制数字。你在这里有一个不同的问题。甚至产生这种情况? –

+0

@armnotstrong:更新;从你的问题来看,你不清楚你是否有文字。将来,请显示这样一个字符串的'repr()'输出(这就是您在注释中显示的'dict()'表示使用的每个键和值) –