2011-06-27 71 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'