最近爬js渲染網頁,提取json格式內容的時候。忽然發現寫入本地時內容全是帶‘u'的字符串碼,print輸出依然是帶u的串碼,encode(“utf-8”),則會報UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-16: ordinal not in range(128)錯誤
網上看相關的blog,發下大家都是
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
這樣強制將系統默認編碼格式轉換成utf-8確實能解決print的問題。
但是,寫入文件還是不行。
再有,在百度知道上看到有人修改python安裝目錄下lib文件夾下的site.py,我覺得這樣更加得不償失。
于是瘋狂在網上搜索找答案,終于在stackoverflow上看到相似的問題。回答者說,出現這個問題的主要原因是python解釋器默認是asiic編碼,如果要在print上輸出,則需解碼成unicode。還建議提問者去看howto unicode官方文檔。
于是我上車看howto unicode。
文檔是這樣說的:
原來,解釋器默認編碼都是asiic,如果使用print輸出特殊編碼的字符,則需要先將編碼解碼成unicode,這樣解釋器print的時候會自動將編碼轉換成合適的編碼格式。
如果要寫入文件,那要先解碼unicode,在編碼成UTF-8
如:
>>>a="\u8d1f\u8d23\u4eba"
>>>a
>>>'\\u8d1f\\u8d23\\u4eba'
>>>print a
>>>\u8d1f\u8d23\u4eba
>>>>>> a=a.decode("unicode-escape")#反編碼成unicode碼
>>> a
u'\u8d1f\u8d23\u4eba'
>>> print a
負責人
print 輸出的時候會自動解碼
但是當我們要寫入文件的時候呢
>>> fname="test.txt"
>>> f=open(fname,'w')
>>> f.write(a)
Traceback (most recent call last):? File "", line 1, inf.write(a)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128
這時就需要先轉碼了
>>> f.write(a.encode("utf-8"))
查看文件寫入的內容: