剛開始學習python的時候,都是對這英文的翻譯書學習的。沒有解除到中文編碼的相關問題,直到自己用python去做相關的項目的時候才發先中文編碼問題真的非常頭疼啊。這里分享一下本人所了解的一些經驗。
讀取utf-8個格式存儲的文件
1. 假如現在有一個文件test.txt,里面有內容“python學習”,該文件以utf-8格式存儲。那么讀取並輸出該字符串的方法如下:
filehandle=open("test.txt","r") ## the file is saved as utf-8 without bom print filehandle.read().decode("utf-8").encode("gbk") filehandle.close()
上面的代碼decode("utf-8")是把utf-8格式的內容解碼成unicode編碼,然后通過encode("gbk")轉換成GBK格式輸出。
2. 假如test.txt是以utf-8 含有BOM的格式存儲,讀入方式又不一樣,這種格式會在文件最開始的地方插入看不見的字符BOM(即0xEF 0xBB 0xBF),需要用到codecs。(用notepad++可以選擇將文件保存為utf-8,utf-8無BOM等個存儲格式)
filehandle=open("test.txt","r") ## the file is saved as utf-8 with bom content = filehandle.read() if content[:3]==codecs.BOM: content=content[3:] print content.decode("utf-8")#.encode("gbk") filehandle.close()
這邊為什么不需要用到encode("gbk")?很費解
讀取ASNI格式存儲的文件
這種就非常簡單了,不需要任何轉換
filehandle=open("test.txt","r") ## the file is saved as ASNI content = filehandle.read() print content filehandle.close()
python腳本中包含hardcode的中文
#!/usr/bin/env python def main(): s="python學習" print s if __name__ == '__main__': main()
python中默認的編碼方式是ASCII(可以通過sys.getdefaultencoding()),上面的test.py文件是以ASCII格式保存的,當調用print的時候會隱式地進行從ASCII到系統默認編碼(Windows上為CP936,可以通過sys.stout.encoding)的轉換,中文字符並不是ASCII,所以需要在test.py文件中進行編碼聲明。需要在開頭加上一句 "# coding=utf-8"即可(最好用文本編輯器或notepad++,不然可能會有意想不到的輸出)
總之,最好避免在腳本源文件中試用hardcode的字符串,尤其是中文字符。
普通字符和中文字符進行字符串連接
# coding=utf-8 def main(): s="python學習"+u"hello" print s if __name__ == '__main__': main()
使用+操作符連接字符串的時候,左邊為str類型,右邊為unicode類型。python會見左邊的中文字符串轉換為Unicode后再與右邊的Unicode連接,將str轉換為Unicode的時候試用系統默認的ASCII編碼對字符串進行解碼,所以可能會產生UnicodeDecodeError異常。下面的解決方法:
s="python學習".decode("gbk")+u"hello"
或者
s="python學習"+u"hello".encode("utf-8")
字符串行為與python3一致
最后提一點,從python2.6以后可以通過下面的方式將定義的普通字符串識別為Unicode字符串,這樣字符串的行為將與python3保持一致
from __future__ import unicode_literals