【问题标题】:python encoding conversionpython编码转换
【发布时间】:2011-09-23 19:42:06
【问题描述】:

这是我的问题,我想修复一个编码错误的变量。长话短说,我最终得到:

myVar=u'\xc3\xa9'

这是错误的,因为它是字符 'é' 或 \u00e9 UTF-8 编码,而不是 unicode。

我尝试过的编码/解码组合似乎都不能解决问题。我查看了 bytearray 对象,但您必须提供编码,显然它们都不适合。

基本上我需要将字节数组重新解释为正确的编码。关于如何做到这一点的任何想法? 谢谢。

【问题讨论】:

  • 你想得到什么,unicode 还是 str?
  • @X-Istence : nope unicode 是一个 number 代表一个字符,而 UTF-8 是一个 encoding 代表那个数字(例如UTF-16、UTF-32 ...)

标签: unicode encoding utf-8 python-2.6


【解决方案1】:

hacky 解决方案:使用ord 提取代码点,然后使用chr 从这些代码点中构建字符(长度为一的字符串),然后将这些代码点粘贴在一起并解码。

>>> u = u'\xc3\xa9'
>>> s = ''.join(chr(ord(c)) for c in u)
>>> unicode(s, encoding='utf-8')
u'\xe9'

【讨论】:

    【解决方案2】:

    你应该做的。

    >>> b='\xc3\xa9'
    >>> b
    '\xc3\xa9'
    >>> b.decode("UTF-8")
    u'\xe9'
    

    由于您没有显示导致问题的损坏代码,我们所能做的就是让复杂的问题变得更复杂。

    这似乎就是您所看到的。

    >>> c
    u'\xc3\xa9'
    >>> c.decode("UTF-8")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    

    这里有一个解决方法。

    >>> [ chr(ord(x)) for x in c ]
    ['\xc3', '\xa9']
    >>> ''.join(_)
    '\xc3\xa9'
    >>> _.decode("UTF-8")
    u'\xe9'
    

    修复产生错误内容的代码。

    【讨论】:

    • 是的,我知道应该做什么,解决问题的根源是最好的解决方案。但我处于我做不到的情况,所以我会采取临时措施,这正是我想要的。谢谢。
    • 看来c.encode('iso-8859-15').decode('utf-8').encode('utf-8') 也可以。我是不是特殊情况?
    • @gregseth:不。许多编码重叠。 UTF-8 的意义在于,对于大多数标准 ASCII 字符来说,它看起来有点像 ASCII。我不知道您在该评论中所说的“作品”是什么意思,因为没有必要先进行解码以创建 Unicode,然后再进行编码以再次重新创建字节。 Python 代码以 Unicode 工作。时期。外部文件被编码(在输出上)和解码(在输入上)。除了文件 I/O 之外,编码和解码没有其他用途。
    • 好吧,我的错,我很困惑。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多