2011-06-27 75 views
5

这是我的问题,我有一个我想修复的错误编码的变量。长话短说,我结束了:python编码转换

myVar=u'\xc3\xa9' 

这是不对的,因为它是字符“E”或\u00e9 UTF-8编码,不是Unicode。

我试过的编码/解码组合似乎都没有解决这个问题。我看着bytearray对象,但你必须提供一个编码,而且显然没有一个适合。

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

+1

UTF-8是unicode。 –

+0

你想结束什么,unicode或str? – pajton

+1

@ X-Istence:nope unicode是一个*号*代表一个字符,而UTF-8是该编号的一个*编码*(例如UTF-16,UTF-32 ...) – gregseth

回答

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' 

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

+0

是的,我知道应该做些什么,而解决问题的根源是最好的解决方案。但是,我处于一种我无法做到的情况,所以我会采取工作方式,这正是我想要的。谢谢。 – gregseth

+0

看起来'c.encode('iso-8859-15')。decode('utf-8')。encode('utf-8')'也可以。我在特殊情况下吗? – gregseth

+0

@gregseth:不。许多编码重叠。对于大多数标准ASCII字符而言,UTF-8的含义就像ASCII一样。我不知道这个评论中的“作品”是什么意思,因为解码创建Unicode之后再编码再次重新创建字节是没有意义的。 Python代码以Unicode编码。期。外部文件被编码(输出)和解码(输入)。除了文件I/O之外,没有其他用于编码和解码的用途。 –

1

hacky解决方案:用ord拉出代码点,然后用chr构建其中的字符(长度为一个字符串),然后粘贴到一起并解码。

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