Python 编码转换

5

我遇到了一个问题,我有一个变量被错误地编码了,我想要修复它。简而言之,我得到了以下内容:

myVar=u'\xc3\xa9'

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

我尝试过所有的编码/解码组合都无法解决问题。我转向了bytearray对象,但必须提供一种编码方式,显然没有一种适合。

基本上,我需要重新解释字节数组到正确的编码方式。有什么想法吗?谢谢。


你想最终得到什么,Unicode 还是 str? - pajton
1
@X-Istence: 不是,Unicode 是代表一个字符的数字,而 UTF-8 则是对该数字进行编码的一种方式(例如 UTF-16、UTF-32 等)。 - gregseth
2个回答

5
你应该已经完成的事情。
>>> 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'

修复一开始就产生错误的代码。


是的,我知道应该做什么,修复问题的根源是最好的解决方案。但我处于一个无法这么做的情况下,因此我会采取变通方法,这正是我想要的。谢谢。 - gregseth
似乎 c.encode('iso-8859-15').decode('utf-8').encode('utf-8') 也可以工作。我处于一个特殊情况吗? - gregseth
@gregseth:不是的。许多编码重叠。UTF-8 的目的是对于大多数标准 ASCII 字符,看起来模糊地像 ASCII。我不知道你在那个评论中所说的“工作”是什么意思,因为没有必要进行解码以创建 Unicode,然后进行编码以重新创建字节。Python 代码使用 Unicode。完结撒花。外部文件被编码(在输出时)和解码(在输入时)。除了文件 I/O 外,没有其他用途需要编码和解码。 - S.Lott
好的,我的错,我有点混淆了。谢谢你的时间。 - gregseth

1

一种巧妙的解决方案:使用ord提取代码点,然后使用chr将其构建为字符(长度为一的字符串),然后将所有内容粘贴在一起并进行解码。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接