python的字元轉換常見bug

1.python把一個unicode字元串寫入文件為什麼會報錯?

write方法的參數類型是str,str是二進位流(不包含編碼資訊),當你給出一個unicode對象時,會執行str函數轉換成str類型再送給write方法。unicode轉str包含一次編碼,如不指定則默認使用ascii編碼,而ascii編碼集里漢字字元是沒有對應的,所以報錯。

正確做法是在程式碼里指定編碼。比如在open里指定(fp= open('test.txt', 'w', encoding='utf-8')),或者在write的時候手動把unicode對象通過encode方法指定編碼產生str。就是說寫成fp.write(s.encode('utf8'))。注意unicode對象用encode是有意義的,str對象在py2里允許你對str對象使用encode,然而這是對指定了default encoding的情況下才有效的,因此不推薦新手對str直接encode。

2.Error:UnicodeEncodeError: 『gbk』 codec can』t encode character u』u200e』 in position 43: illegal multibyte sequence

原來出現』gbk』 codec can』t encode」的錯誤的根本原因是,對於前面的,不論是用

titleHtml.decode(「UTF-8」);

還是titleHtml.decode(「UTF-8」, 『ignore』);

還是titleHtml.decode(「UTF-8」, 『replace』);

都是可以得到正常的titleUni的Unicode字元的,然後對於此Unicode的字元,需要print出來的話,由於本地系統是Win7中的cmd,默認codepage是CP936,即GBK的編碼,所以需要先將上述的Unicode的titleUni先編碼為GBK,然後再在cmd中顯示出來,然後由於titleUni中包含一些GBK中無法顯示的字元,導致此時提示「』gbk』 codec can』t encode」的錯誤的。

對於此(類)問題:

(1)出現UnicodeEncodeError –> 說明是Unicode編碼時候的問題;

(2) 『gbk』 codec can』t encode character –> 說明是將Unicode字元編碼為GBK時候出現的問題;

此時,往往最大的可能就是,本身Unicode類型的字元中,包含了一些無法轉換為GBK編碼的一些字元。

解決辦法是:

方案1:

在對unicode字元編碼時,添加ignore參數,忽略無法無法編碼的字元,這樣就可以正常編碼為GBK了。

對應程式碼為:

gbkTypeStr = unicodeTypeStr.encode(「GBK「, 『ignore』);

方案2:

或者,將其轉換為GBK編碼的超集GB18030 (即,GBK是GB18030的子集):

gb18030TypeStr = unicodeTypeStr.encode(「GB18030「);

對應的得到的字元是GB18030的編碼。