普通的字符串在py2.7中都是以ASCII編碼的,例如str=“abc”,若含有中文則會以gbk或者gb2312編碼(GB2312是中國規定的漢字編碼,也可以說是簡體中文的字符集編碼;GBK 是 GB2312的擴展 ,除了兼容GB2312外,它還能顯示繁體中文,還有日文的假名)
但在字符串前加u,例如str=u“abc”,則可以將字符串定義成Unicode編碼
系統自帶的編碼查看可通過 sys.getdefaultencoding() 獲得,若要修改默認編碼需要先 reload(sys) ,因為初始化后會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入,之后使用 sys.setdefaultencoding('utf-8') 即可修改
編輯py文件時在頭部加上# -*- coding: utf-8 -*- 可以使這個py文件以utf-8編碼,里面可以包含中文
decode的作用是將其他編碼的字符串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字符串轉換成unicode編碼
encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode('gb2312'),表示將unicode編碼的字符串轉換成gb2312編碼,
若原字符串不是unicode編碼而直接encode,則以系統默認編碼進行解碼,再encode,即 str2.encode('gb2312') == str2.decode(sys.getdefaultencoding()).encode('gb2312')
如果是在utf-8的文件中,字符串就是utf-8編碼,如果是在gb2312的文件中,則其編碼為gb2312。這種情況下,要進行編碼轉換,都需要先用 decode方法將其轉換成unicode編碼,再使用encode方法將其轉換成其他編碼。通常,在沒有指定特定的編碼方式時,都是使用的系統默認編碼創建的代碼文件。
isinstance(str,unicode)可以判斷一個字符串是否為unicode編碼,是則返回True,不是返回False
如果直接解碼一些包含特殊字符的編碼,可能會拋出異常,可以用以下方法解決:
s.decode("utf-8", "ignore") 忽略其中有異常的編碼,僅顯示有效的編碼
s.decode("utf-8", "replace") 替換其中異常的編碼,這個相對來可能一眼就知道那些字符編碼出問題了,但是會把原來的編碼搞亂,多用於測試,不是很實用
可以看到把gbk編碼解碼后要正確顯示中文不能用utf-8來encode,還是只能用gbk或gbk2312,推測打開一些 txt 或 word 時的亂碼應該就是把gbk的編碼用utf-8顯示了
各種編碼常見編碼參考:http://blog.csdn.net/shijing_0214/article/details/50908144
一篇比我寫的好多了的博客:http://www.cnblogs.com/franknihao/p/6557559.html