2010-04-12 76 views
2

好吧,我有一個硬編碼字符串,我宣佈這樣解碼不扭轉在Django/Python的Unicode編碼

name = u"Par Catégorie" 

我有一個# - - 編碼:UTF-8 - - 魔術頭,所以我我猜測它轉換爲UTF-8

下山的路它的輸出通過

xml_output.toprettyxml(indent='....', encoding='utf-8') 

到XML和我得到一個

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128) 

我的大部分數據都是法文的,並且在CDATA節點中正確輸出,但是那個編碼字符串保持不變......我不明白爲什麼要調用ascii編解碼器。

有什麼不對?

回答

4

在源文件中的coding頭告訴Python中所編碼的是,它的編碼Python使用的Unicode字符串字面(u"Par Catégorie")的源解碼成一個Unicode對象。 unicode對象本身沒有編碼;這是原始的unicode數據。 (在內部,Python將使用兩種編碼之一,具體取決於它的配置方式,但Python代碼不應該擔心這一點。)

UnicodeDecodeError你意味着某處,你在混合unicode字符串和字節串(normal )將它們混合在一起(連接,執行字符串插值等),Python將嘗試通過使用默認編碼ASCII解碼字節串來將字符串轉換爲Unicode字符串。如果字符串包含非ASCII數據,則會失敗並顯示錯誤。正在完成的操作可能在某個庫中,但它仍然意味着您正在混合不同類型的輸入。

不幸的是,只要字節串只包含ASCII數據就可以正常工作,這意味着即使在庫代碼中,這種類型的錯誤也非常頻繁。 Python 3.x通過擺脫unicode字符串(僅在3.x中的str)和字節串(在3.x中的bytes類型)之間的隱式轉換來解決該問題。

+0

賓果。我確實在某處混合了一個字節串和一個unicode字符串。我想我應該總是使用unicode字符串。 感謝您的明確解釋。 – philgo20 2010-04-13 20:09:28

1

錯誤的參數名稱?從the doc,我可以看到關鍵字參數名稱應該是encoding而不是coding

+1

我編輯了問題,但我使用了右參數名稱。只是解決問題。由於某種原因,在殼我得到 >>>'cat \ xc3 \ xa9gorie'.decode('''''') utf-8') u'cat \ xe9gorie' 所以我擔心這個字符串不會被正確地輸出到xml。錯誤的假設。 – philgo20 2010-04-12 21:09:13