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

如何用python解码代表utf-8的字符串?,python,utf-8,decode,encode,Python,Utf 8,Decode,Encode,我有一个unicode,如下所示: \xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7 我知道它是代表字节的字符串,用utf-8 请注意,字符串\xE5\xB1\xB1\xE4\xB8\x9C\xE6\x97\xA5\xE7\x85\xA7本身就是 如何将其解码为真正的字符串山东 日照?如果您打印了unicode字符串的repr()输出,那么您似乎有一个字节的数据使用错误的编码进行了解码 首先编码回字节,然后使用正确的编解码器进行解码。这可能与拉

我有一个unicode,如下所示:

\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7
我知道它是代表
字节
的字符串,用
utf-8

请注意,字符串
\xE5\xB1\xB1\xE4\xB8\x9C\xE6\x97\xA5\xE7\x85\xA7
本身就是


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

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

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

unicode_string.encode('latin1').decode('utf8')
然而,这取决于错误解码的应用方式。如果使用了Windows代码页(如CP1252),那么如果强制解码CP1252范围之外的UTF-8字节,最终可能会得到实际上不可编码回CP1252的Unicode数据

修复此类错误的最佳方法是使用,它知道如何为各种编解码器处理强制解码的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)
山东 日照
如果文字字符
\
x
,后跟两位数字,则有另一层编码,其中字节分别替换为4个字符。您必须首先将它们“解码”为实际字节,方法是让Python用
string\u escape
codec解释转义:

>>> 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\u escape”
是一种仅用于Python 2的编解码器,它生成bytestring,因此以后可以安全地将其解码为UTF-8。

谢谢,Martijn,如果我打印包含它显示的字符串的dict怎么办
{u'qualifier':u'name',u'timestamp':u'146275769186',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:您没有字节。您有文本反斜杠、
x
字符和十六进制数字。您在这里遇到了不同的问题。是什么导致了这一问题?@armnotstrong:更新;从您的问题来看,不清楚您是否有文本。以后,请显示
repr()
这样一个字符串的输出(这就是您在注释中显示的用于每个键和值的
dict()
表示法).原始数据是从hbase检索的,它只能将ASCII字符串存储为值。并且
org.apache.spark.examples.pythonconverters.hbaseresUltoStringConverter
提供了这一点。对不起,我对spark不熟悉。不知道这是spark问题还是数据最初的存储方式问题。