如果您打印了字符串的
repr()输出,
unipre那么您似乎有一个
Mojibake ,使用错误的编码对字节数据进行了解码。
首先编码回字节,然后使用正确的编解码器解码。这可能像编码Latin-1一样简单:
unipre_string.enpre('latin1').depre('utf8')
但是,这取决于如何应用错误的解码。如果使用Windows代码页(如CP1252),则无论如何强制对CP1252范围之外的UTF-8字节进行编码,最终可能会得到实际上无法编码回CP1252的Unipre数据。
修复此类错误的最佳方法是使用
ftfy库,该库知道如何处理各种编解码器的强制解码的Mojibake文本。
对于您的小样本,Latin-1 似乎 可以正常工作:
>>> unipre_string = u'xE5xB1xB1xE4xB8x9C xE6x97xA5xE7x85xA7'>>> print unipre_string.enpre('latin1').depre('utf8')山东 日照>>> import ftfy>>> print ftfy.fix_text(unipre_string)山东 日照
如果您有 文字
字符
x后跟两位数字,那么您将拥有另一层编码层,其中字节被4个字符替换。您必须先要求Python使用
string_escape编解码器解释转义,然后才能将其“解码”为实际字节:
>>> unipre_string = ur'xE5xB1xB1xE4xB8x9C xE6x97xA5xE7x85xA7'>>> unipre_stringu'\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7'>>> print unipre_string.depre('string_escape').depre('utf8')山东 日照
'string_escape'是一个Python 2唯一的编解码器,它产生一个字节串,因此以后将其解码为UTF-8是安全的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)