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

标签 python utf-8 decode encode

我有这样的 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 个字符。您必须先将这些“解码”为实际字节,方法是要求 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 是安全的。

关于python - 如何用python解码代表utf-8的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39035899/

相关文章:

脚本中的 Python 3 控制流有很多步骤

python - 安装另一个版本的 Numpy

python - 如何解码 python-requests URL?

python - 从 json 读取数组,无需任何根对象

java - 带有 Thymeleaf 的 utf8 字符集

assembly - 将 i386 操作码解码为指令

vim - 使用 tmux 在 vi​​m 中表情符号显示问题

php - 如果仅将有效的 UTF-8 编码字符串作为参数给出 str_replace 是否可以安全地用于 UTF-8 编码字符串?

java - Solr 编码/解码数据

java - 连接到 LDAP 时 JNDI 无法正确解码 BASE64 字符串