如何用 python 解码代表 utf-8 的字符串?
How to decode string representative of utf-8 with python?
我有这样的 unicode:
\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'>
如何解码为真正的字符串山东 日照
?
如果您打印了 unicode
字符串的 repr()
输出,那么您似乎有一个 Mojibake,使用错误编码解码的字节数据。
首先编码回字节,然后使用正确的编解码器解码。这可能就像编码 Latin-1 一样简单:
unicode_string.encode('latin1').decode('utf8')
但这取决于如何应用不正确的解码。如果使用 Windows 代码页(如 CP1252),如果 CP1252 范围之外的 UTF-8 字节无论如何都被强制解码,您最终会得到实际上无法编码回 CP1252 的 Unicode 数据。
修复此类错误的最佳方法是使用 ftfy
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个字符。您必须首先 'decode' 那些实际字节,方法是要求 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 是安全的。
我有这样的 unicode:
\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'>
如何解码为真正的字符串山东 日照
?
如果您打印了 unicode
字符串的 repr()
输出,那么您似乎有一个 Mojibake,使用错误编码解码的字节数据。
首先编码回字节,然后使用正确的编解码器解码。这可能就像编码 Latin-1 一样简单:
unicode_string.encode('latin1').decode('utf8')
但这取决于如何应用不正确的解码。如果使用 Windows 代码页(如 CP1252),如果 CP1252 范围之外的 UTF-8 字节无论如何都被强制解码,您最终会得到实际上无法编码回 CP1252 的 Unicode 数据。
修复此类错误的最佳方法是使用 ftfy
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个字符。您必须首先 'decode' 那些实际字节,方法是要求 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 是安全的。