2016-01-15 71 views
0

我有一個具有編碼問題SQL數據庫,所以它返回我的結果,該結果與此類似:的Python 3.3編碼問題

"Cuvée" 

從我可以告訴,這是因爲它被編碼爲拉丁語1時它應該已被編碼爲UTF-8(請糾正我,如果我錯了)。我在Python腳本處理這些結果,並已得到一些編碼的問題,一直無法將其轉換回到它應該是:

"Cuvée" 

我使用Python 3.3,但使用的編解碼器.decode使從latin1更改爲utf-8我得到︰

'str' does not support the buffer interface 

我想我已經嘗試了一切,我發現無濟於事。我並不熱衷於使用Python 2.7,因爲我已經在3.3中編寫了腳本的其餘部分,而且重寫會很痛苦。有沒有辦法做到這一點,我不知道?

+1

請顯示引發異常的實際代碼。你必須*重新編碼*(編碼,然後解碼)。 –

回答

1

是的,你有所謂的Mojibake;它可以是Latin-1,也可以是Windows Codepage 1252或另一個密切相關的編解碼器。

可以只是試圖編碼爲Latin-1的,然後再進行解碼:

faulty_text.encode('latin1').decode('utf8') 

但是,有時候,特別是與CP1252 Mojibakes,故障編碼結果中的文本不能合法編碼回到字節,因爲即使編解碼器不支持這些字節,一些UTF-8字節也被強制「解碼」。

你最好打賭是安裝ftfy library,它可以自動爲你修復這樣的Mojibake錯誤。它包含特殊的編解碼器,可以正確地撤銷CP1252 Mojibakes(以及其他相關代碼頁),可以繞過上述問題的編解碼器。

+0

非常感謝!這解決了它! – brunoban

1

嘗試先轉換爲字節,然後解碼unicode。根據你的例子:

latin_string = "Cuvée" 
# Get a byte representation of the latin string 
bytes(latin_string,'latin-1') 
b'Cuv\xc3\xa9e' # Note the preceding b 
# Get a byte representation and decode the utf-8 to get a 'pretty' string 
bytes(latin1string,'latin-1').decode('utf-8') 
'Cuvée'