2010-04-21 45 views
5

有沒有人知道爲什麼字符串轉換函數在錯誤=「忽略」通過時會拋出異常?我怎樣才能從常規的Python字符串對象轉換爲unicode而不會引發錯誤?非常感謝!python unicode編碼/解碼函數的異常(爲什麼不錯誤=忽略實際忽略它們?)

python -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')" 

回報
回溯(最近通話最後一個):
文件 「」,1號線,在
文件 「/usr/lib/python2.6/codecs.py」,線路686,在寫
return self.writer.write(data)
寫入文件「/usr/lib/python2.6/codecs.py」,第351行,
data,consume = self.encode(object,self.errors )
UnicodeDecodeError:'ascii'編解碼器無法解碼位置0中的字節0xd0:序號不在範圍內(128)

編輯 - 謝謝你的迴應,但有誰知道如何轉換上面的文字,而不是使用「u」前綴?原因是你當然可以處理的東西不是一個常量:)

回答

2

在Python 2.x中使用寫(」 кошка'.decode( 'UTF-8')代替寫( 'кошка')

您可以使用其他的編碼過的不是 'UTF-8'。

希望它不會拋出任何錯誤...

3

write方法(在Python 2中)需要一個unicode對象,並且你將它傳遞給一個str - 所以encode調用codecs.py行351首先嚐試構建一個unicode對象(使用默認編解碼器'ascii')。修復很簡單:改變write調用

write(u'кошка') 

u前綴告訴Python中,你正在使用一個Unicode對象,它應該是罰款。

+0

這是更好的答案。它提供了與Python 3的轉發兼容性。 – Alan 2017-05-11 13:52:43

1

問題是在這裏=== >>>>寫(「кошка」)

你正在編寫一個海峽對象,收件人期待一個Unicode對象,所以它會試圖將其轉換使用默認爲Unicode編碼(ASCII),這當然(?)產生衆所周知的(?)UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position 0: ordinal not in range(128)

整個使用的編解碼器模塊類似的一點是要得到它對象轉換您的統一爲utf8編碼上飛 - 所以餵它unicode

更新如何轉換文字或非文字:

unicode_object = literal_or_whatever.decode( 「UNKNOWN_ENCODING」)

你知道你的文字編碼?你想告訴我們你想完成什麼嗎?一個一個內膽採用python -c沒有太大的幫助;-)

+0

unicode()函數不起作用,它會拋出相同的異常。 – gatoatigrado 2010-04-21 02:56:17

+0

@gatoatigrado:我說要餵它unicode;我沒有說使用'unicode()'函數。如果您在不指定編碼的情況下使用'unicode()',OF COURSE將獲得相同的異常(默認編碼爲ascii)。並請閱讀我答案的最後一句。 – 2010-04-21 03:09:53

+0

啊,對不起,我正在掃描,對不起。問題是如何從Python字符串提供unicode。邏輯的方式是'unicode(pystr)',但這是行不通的。我認爲我之前用過bytes(),但我想知道真正的解決方案是什麼。 – gatoatigrado 2010-04-21 03:20:25

2

非解決方案(從問題的作者)我剛剛發現:使用python3

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')" 
+0

是的,Python 3支持本地unicode。 =] – 2010-04-21 14:04:55