1.python把一個(gè)unicode字符串寫(xiě)入文件為什么會(huì)報(bào)錯(cuò)?
專(zhuān)注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)樅陽(yáng)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
write方法的參數(shù)類(lèi)型是str,str是二進(jìn)制流(不包含編碼信息),當(dāng)你給出一個(gè)unicode對(duì)象時(shí),會(huì)執(zhí)行str函數(shù)轉(zhuǎn)換成str類(lèi)型再送給write方法。unicode轉(zhuǎn)str包含一次編碼,如不指定則默認(rèn)使用ascii編碼,而ascii編碼集里漢字字符是沒(méi)有對(duì)應(yīng)的,所以報(bào)錯(cuò)。
正確做法是在代碼里指定編碼。比如在open里指定(fp= open('test.txt', 'w', encoding='utf-8')),或者在write的時(shí)候手動(dòng)把unicode對(duì)象通過(guò)encode方法指定編碼產(chǎn)生str。就是說(shuō)寫(xiě)成fp.write(s.encode('utf8'))。注意unicode對(duì)象用encode是有意義的,str對(duì)象在py2里允許你對(duì)str對(duì)象使用encode,然而這是對(duì)指定了default encoding的情況下才有效的,因此不推薦新手對(duì)str直接encode。
2.Error:UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence
原來(lái)出現(xiàn)’gbk’ codec can’t encode”的錯(cuò)誤的根本原因是,對(duì)于前面的,不論是用
titleHtml.decode(“UTF-8”);
還是titleHtml.decode(“UTF-8”, ‘ignore’);
還是titleHtml.decode(“UTF-8”, ‘replace’);
都是可以得到正常的titleUni的Unicode字符的,然后對(duì)于此Unicode的字符,需要print出來(lái)的話(huà),由于本地系統(tǒng)是Win7中的cmd,默認(rèn)codepage是CP936,即GBK的編碼,所以需要先將上述的Unicode的titleUni先編碼為GBK,然后再在cmd中顯示出來(lái),然后由于titleUni中包含一些GBK中無(wú)法顯示的字符,導(dǎo)致此時(shí)提示“’gbk’ codec can’t encode”的錯(cuò)誤的。
對(duì)于此(類(lèi))問(wèn)題:
(1)出現(xiàn)UnicodeEncodeError –> 說(shuō)明是Unicode編碼時(shí)候的問(wèn)題;
(2) ‘gbk’ codec can’t encode character –> 說(shuō)明是將Unicode字符編碼為GBK時(shí)候出現(xiàn)的問(wèn)題;
此時(shí),往往最大的可能就是,本身Unicode類(lèi)型的字符中,包含了一些無(wú)法轉(zhuǎn)換為GBK編碼的一些字符。
解決辦法是:
方案1:
在對(duì)unicode字符編碼時(shí),添加ignore參數(shù),忽略無(wú)法無(wú)法編碼的字符,這樣就可以正常編碼為GBK了。
對(duì)應(yīng)代碼為:
gbkTypeStr = unicodeTypeStr.encode(“GBK“, ‘ignore’);
方案2:
或者,將其轉(zhuǎn)換為GBK編碼的超集GB18030 (即,GBK是GB18030的子集):
gb18030TypeStr = unicodeTypeStr.encode(“GB18030“);
對(duì)應(yīng)的得到的字符是GB18030的編碼。