- 先認(rèn)識(shí)一下常見(jiàn)的幾種編碼方式,記得有一個(gè)《編碼的故事》對(duì)相關(guān)的編碼發(fā)展講得很詳細(xì),可以參考一下。
- GB2312:中國(guó)規(guī)定的漢字編碼,即簡(jiǎn)體中文的字符集編碼
- GBK :GB2312的擴(kuò)展 ,兼容GB2312,還能顯示繁體中文與日文的假名。
- Unicode:國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案
- UTF-8 (8-bit Unicode Transformation Format)是最流行的一種對(duì) Unicode 進(jìn)行傳播和存儲(chǔ)的編碼方式
- 再提一句編程過(guò)程中遇到的編碼出現(xiàn)的不同位置。我們有些時(shí)候再cmd里運(yùn)行正常,但是寫入文件就出現(xiàn)問(wèn)題的原因就是這幾個(gè)部分不一致的原因。
- 程序文件的編碼
- 程序運(yùn)行時(shí)環(huán)境(IDE)的編碼
- 程序讀取的外部文件或者網(wǎng)頁(yè)的編碼
記事本的另存為對(duì)話框里編碼ANSI就是MBCS
- 因?yàn)镻ython2編輯器默認(rèn)的編碼是ASCII,無(wú)法識(shí)別中文,所以我們經(jīng)常在程序的第一行加上:
#coding=utf-8。通過(guò)鍵入sys.getdefaultencoding()可以了解當(dāng)前編輯系統(tǒng)的的編碼方式;除此之外python里可以使用encode('XXX')來(lái)實(shí)現(xiàn)編碼的變化,一般來(lái)說(shuō),常常使用unicode作為中間編碼方式,utf-8---unicode--gbk。
對(duì)
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
PS:在cmd 下輸入:chcp 65001 命令回車可以改變CMD的編碼方式為utf-8, chcp 936 可以換回默認(rèn)的GBK,chcp 437 是美國(guó)英語(yǔ)
- 使用python將unicode編碼方式的字符串存儲(chǔ)在TXT格式下,出現(xiàn)編碼問(wèn)題:只要是中文,進(jìn)入記事本打開都是亂碼,出現(xiàn)這個(gè)問(wèn)題的原因是記事本默認(rèn)的編碼方式是ANSI,導(dǎo)致編碼直接轉(zhuǎn)化,出現(xiàn)問(wèn)題。嘗試了在python中修改編碼方式都沒(méi)有成功,最后嘗試將字符存儲(chǔ)的文件后綴改成log(dat之類的隨便改),編碼方式正常。對(duì)比
注: 記事本可以在另存為的時(shí)候可以設(shè)置默認(rèn)的編碼方式有ANSI 、Unicode、Unicode-big-endian、UTF-8。還有一種方法:修改注冊(cè)表的方式修改記事本編碼可以長(zhǎng)久解決。 - 與程序相關(guān)的幾種編碼方式。比如一個(gè)中文詞:哈哈,在設(shè)置為
coding:gbk的python代碼中,存儲(chǔ)在編碼為utf-8的文件中。首先獲取'哈哈'的編碼時(shí),由文件編碼格式確定,為'\xe5\x93\x88\xe5\x93\x88'。要改變編碼方式的時(shí)候,用聲明編碼處指定的編碼GBK,將'\xe5\x93\x88\xe5\x93\x88'按GBK解碼,得到就是''鍝堝搱' - 使用python的encode與decode的錯(cuò)誤也很多,因?yàn)榇藭r(shí)要使用unicode作為中間編碼方式,在文件存儲(chǔ),文件解析,文件運(yùn)行結(jié)果展示的編碼不一致的時(shí)候出現(xiàn)很多問(wèn)題。在字符串編碼是unicode的時(shí)候,可以直接encode為gbk,如果是utf-8則需要先decode改為unicode之后才能encode變成gbk。
#!/usr/bin/env python
#coding=utf-8
s="中文"
if isinstance(s, unicode):
#s=u"中文"
print s.encode('gb2312')
else:
#s="中文"
print s.decode('utf-8').encode('gb2312')
- python獲取編碼屬性
Python獲取系統(tǒng)編碼參數(shù)的幾個(gè)函數(shù)
系統(tǒng)的缺省編碼(一般就是ascii):sys.getdefaultencoding()
系統(tǒng)當(dāng)前的編碼:locale.getdefaultlocale()
系統(tǒng)代碼中臨時(shí)被更改的編碼(通過(guò)locale.setlocale(locale.LC_ALL,“zh_CN.UTF-8″)):locale.getlocale()
文件系統(tǒng)的編碼:sys.getfilesystemencoding()
終端的輸入編碼:sys.stdin.encoding
終端的輸出編碼:sys.stdout.encoding
參考資料:
python 相關(guān)編碼[轉(zhuǎn)]
玩轉(zhuǎn)Python讓人討厭的編碼問(wèn)題
python常用功能介紹之一:編碼與解碼
