2010-07-29 34 views
0

我正在使用以latin1編碼的外部數據。所以我添加sitecustomize.py,並在其中加入在Python中設置隱式默認編碼解碼錯誤處理

sys.setdefaultencoding('latin_1') 

果然,現在的latin1字符串處理工作正常。

但是,萬一我碰到的東西,是不是在LATIN1編碼:

s=str(u'abc\u2013') 

我得到UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 3: ordinal not in range(256)

我想那是什麼不可解碼字符會被簡單地忽略,即我會得到在上面的示例s=='abc?'中,並且每次都沒有明確地調用decode()encode,即在每個調用中不是s.decode(...,'replace')。

我試着做與codecs.register_error不同的事情,但無濟於事。

請幫忙?

+1

如果你正在做's = str(u'abc \ u2013')',你想用unicode工作,如果你把默認編碼設置爲'latin-1',這看起來很奇怪 – 2010-07-29 14:16:05

+1

這是一個壞主意: http://tarekziade.wordpress.com/2008/01/08/syssetdefaultencoding-is-evil/。如果你使用編碼的字符串,你應該明確地解碼它們。否則,你可能會掩蓋討厭的錯誤。 – katrielalex 2010-07-29 14:17:50

+1

具體來說,你應該使用模塊內的Unicode。當外部數據進入時對其解碼,並在其再次熄滅時進行編碼。 – katrielalex 2010-07-29 14:21:03

回答

1

腳本無法調用sys.setdefaultencoding是有原因的。不要那樣做,一些庫(包括Python附帶的標準庫)希望缺省值爲'ascii'。

相反,在讀入程序(通過文件,標準輸入,套接字等)時將字符串顯式解碼爲Unicode,並在寫出字符串時顯式編碼字符串。

顯式解碼需要一個參數指定不可解碼字節的行爲。

相關問題