2024-04-23 17:20:29 发布
网友
我有一个像这样的unicode:
\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7
我知道它是代表bytes的字符串,用utf-8编码
bytes
utf-8
注意字符串\xE5\xB1\xB1\xE4\xB8\x9C \xE6\x97\xA5\xE7\x85\xA7本身就是<type 'unicode'>
<type 'unicode'>
如何将其解码为真正的字符串山东 日照?
山东 日照
如果您打印了unicode字符串的repr()输出,那么您似乎有一个Mojibake,字节数据使用错误的编码解码。
unicode
repr()
首先编码回字节,然后使用正确的编解码器解码。这可能与拉丁语-1的编码一样简单:
unicode_string.encode('latin1').decode('utf8')
这取决于错误的解码是如何应用的。如果使用的是Windows代码页(如CP1252),那么如果强制解码CP1252范围外的UTF-8字节,则最终可能会得到实际上无法编码回CP1252的Unicode数据。
修复此类错误的最佳方法是使用^{} library,它知道如何处理各种编解码器的强制解码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_escape编解码器解释转义:
\
x
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专用的编解码器,它生成一个bytestring,因此在之后将其解码为UTF-8是安全的。
'string_escape'
如果您打印了
unicode
字符串的repr()
输出,那么您似乎有一个Mojibake,字节数据使用错误的编码解码。首先编码回字节,然后使用正确的编解码器解码。这可能与拉丁语-1的编码一样简单:
这取决于错误的解码是如何应用的。如果使用的是Windows代码页(如CP1252),那么如果强制解码CP1252范围外的UTF-8字节,则最终可能会得到实际上无法编码回CP1252的Unicode数据。
修复此类错误的最佳方法是使用^{} library ,它知道如何处理各种编解码器的强制解码Mojibake文本。
对于您的小样本,Latin-1似乎可以正常工作:
如果有文字字符
\
,x
,后跟两个数字,则有另一个编码层,其中每个字节替换为4个字符。您必须先将这些字节“解码”为实际字节,方法是让Python使用string_escape
编解码器解释转义:'string_escape'
是一个Python 2专用的编解码器,它生成一个bytestring,因此在之后将其解码为UTF-8是安全的。相关问题 更多 >
编程相关推荐