一. 基本知識(shí)1. 如果py文件里面不指定源文件需要用到的編碼格式的話,python解析器就會(huì)用默認(rèn)的編碼去解析,一般是ASCII, 所以如果此時(shí)源文件有中文的話就會(huì)報(bào)錯(cuò),‘SyntaxError: Non-ASCII character......’, 因此一定要顯示指定編碼格式,方法是在py文件第二行加入此句:' #-*- coding: gbk -*-' , 就指定編碼格式為gbk了。當(dāng)然寫法上還可以是滿足這樣的正則表達(dá)式的句子: 'coding[:=]\s*([-\w.]+)' 注意: 一般聲明的coding要和文件編碼一致,這樣最穩(wěn)妥!
2. python中 s = ‘中文' 和 s = u'中文'的區(qū)別: s = '中文' 要變成python解析器識(shí)別的unicode,那就要在運(yùn)行時(shí)才能。因?yàn)榻馕銎鲿?huì)在運(yùn)行時(shí)把s變量decode成unicode。 而s = u'中文'則是在編譯的時(shí)候就變成unicode了,并且會(huì)保存在對(duì)應(yīng)的pyc文件中。 所以兩者的區(qū)別其實(shí)就是什么時(shí)候變成unicode,而且作為參數(shù)傳遞時(shí)有u的直接就是unicode對(duì)象了,而沒有u的只是python中的普通的str, 需要變成unicode來用時(shí)需要調(diào)用decode或者unicode函數(shù)來處理。兩者的聯(lián)系就是他們的最終結(jié)果都是unicode。
3. 文件的編碼 3.1 在編碼問題中,其實(shí)文件本身的編碼也是很重要的。如何查看?用vim的話,可以通過在vimrc文件加入'set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1' 來檢測(cè)文件的編碼格式,會(huì)按照你列的編碼順序來檢測(cè)該文件的編碼。具體做法是加入那句以后,用vim打開該文件后,用set fileencoding來查看。
3.2 文件的編碼其實(shí)就決定了你在文件中寫一句 s = '中文'的時(shí)候,這個(gè)s的值是什么編碼。也就是說,如果文件編碼是gbk,那么s就是gbk編碼,你要變成unicode來用就要s.decode('gbk').
4. python文件中的中文有人是建議都用u'xx'的寫法變成unicode,然后在需要轉(zhuǎn)換顯示的時(shí)候才轉(zhuǎn),我表示同意。 二. python解析源文件的流程
流程圖 reference : http://www./dev/peps/pep-0263/ 三. 遇到的問題遇到的問題的例子比較多,這里不一一列舉了,找了幾個(gè)比較好的參考資料 1. http://zzjjzzgggg./blog/311666 2. http://zzjjzzgggg./blog/309409 5. 用simplejson 來轉(zhuǎn)換數(shù)據(jù): simplejson提供兩類API: 1) loads: 將python的object轉(zhuǎn)化成字符串(<type: 'str'>) 2) dumps : 將字符串轉(zhuǎn)化成python的object. loads明顯是有個(gè)encode的過程, 那么肯定有個(gè)encoding來指定encode時(shí)候的編碼, 不指定默認(rèn)是用utf-8的; 同樣dumps明顯就有個(gè)decode過程, 同樣有個(gè)encoding來指定, 默認(rèn)也是為utf-8; 以前遇到一個(gè)問題是, 通過http接口獲取過來的json數(shù)據(jù)編碼是gbk的, 但是我在loads的時(shí)候沒有指定encoding, 結(jié)果出現(xiàn)亂碼, 找了很久才發(fā)現(xiàn)了問題, 所以我警惕之后調(diào)用這2個(gè)接口的時(shí)候都最好顯示指定encoding,這樣 雖然麻煩了, 但是對(duì)于查找問題和代碼可讀性方面都是有好處的!
經(jīng)驗(yàn)是如果遇到編碼問題,可以從一下幾個(gè)方面去思考: 1)文件本身的 編碼 2)聲明的編碼 3)如果數(shù)據(jù)是從網(wǎng)絡(luò)獲取的或者其他途徑,反正就不是自己的,那么建議代碼中加入try...except UnicodeEncodeError, UnicodeDecodeError 之類的代碼做好防范。 4)建議采用utf-8編碼,如果實(shí)在是對(duì)數(shù)據(jù)量有要求的可以用gbk,因?yàn)樾∫稽c(diǎn)。
歡迎拍磚! |
|
|