【问题标题】:Decoding 'raw' string converted to unicode解码“原始”字符串转换为 unicode
【发布时间】:2016-03-08 21:19:23
【问题描述】:

我有一个脚本,可以通过 lxml 获取一些数据并解析它。

最初它具有lxml.etree._ElementUnicodeResult 类型,但我们可以轻松地将其转换为unicode

有一些危险的时刻。 此 Unicode 字符串包含字符串的原始字节。尽管它的类型为 unicode,但它保留了通常 python str 的原始字节。

label
Out[53]: u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'

有没有办法将这个unicode 原始字节字符串实际转换为原始字节(str 在 python 2 上键入)。

我可以轻松地将其复制粘贴到交互式控制台并将其实际转换为 unicode 点:

'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'
Out[54]: '\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'

'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'.decode('utf-8')
Out[55]: u'\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440'

【问题讨论】:

  • 如果label 最终具有该值,则您的代码中一定存在错误。显示产生它的实际代码。

标签: python python-2.7 unicode encoding


【解决方案1】:

使用“latin-1”编码对字符串进行编码,直接将 256 个字符 U+0000 到 U+00FF 映射到单个字节。

>>> s = u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'
>>> s.encode('latin-1')
b'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'

【讨论】:

    【解决方案2】:

    您的 Unicode 字符串被错误的编解码器解码。它看起来像latin1。您可以使用相同的错误编解码器对其重新编码,然后使用正确的编解码器进行解码。

    s = u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80'
    print(s.encode('latin1').decode('utf8'))
    

    输出:

    Владимир
    

    更好的是,首先正确解码;^)

    【讨论】:

    • 严格来说,它看起来像一个 utf-8 编码的字节串,前面有一个 u。或 latin1 mojibake。
    • 它是 UTF-8。 Владимир 是俄语的 Vladimir
    • 是的,完全正确。我只是开玩笑地(和迂腐地)指出它并不“看起来像 latin1”(因为 Владимир 不能用 latin1 编码)。
    【解决方案3】:

    这有帮助吗?

    str1 = repr(u'\xd0\x92\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd0\xbc\xd0\xb8\xd1\x80')
    print type(str1)
    print str1
    # or
    print str1[1:]
    

    【讨论】:

      猜你喜欢
      • 2021-05-21
      • 2011-09-24
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2018-04-26
      • 2013-03-20
      • 1970-01-01
      相关资源
      最近更新 更多