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

发布于 2021-01-29 15:00:44

我有这样的 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'>

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

关注者
0
被浏览
92
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    首先编码回字节,然后使用正确的编解码器解码。这可能像编码Latin-1一样简单:

    unicode_string.encode('latin1').decode('utf8')
    

    但是,这取决于如何应用错误的解码。如果使用Windows代码页(如CP1252),则无论如何强制对CP1252范围之外的UTF-8字节进行编码,最终可能会得到实际上无法编码回CP1252的Unicode数据。

    修复此类错误的最佳方法是使用ftfy,该知道如何处理各种编解码器的强制解码的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是安全的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看