1. 如果py檔案裡面不指定原始檔需要用到的編碼格式的話,python解析器就會用預設的編碼去解析,一般是ascii, 所以如果此時原始檔有中文的話就會報錯,『syntaxerror: non-ascii character......』, 因此一定要顯示指定編碼格式,方法是在py檔案第二行加入此句:' #-*- coding: gbk -*-' , 就指定編碼格式為gbk了。當然寫法上還可以是滿足這樣的正規表示式的句子: 'coding[:=]\s*([-\w.]+)'
注意: 一般宣告的coding要和檔案編碼一致,這樣最穩妥!
2. python中 s = 『中文' 和 s = u'中文'的區別:
s = '中文' 要變成python解析器識別的unicode,那就要在執行時才能。因為解析器會在執行時把s變數decode成unicode。
而s = u'中文'則是在編譯的時候就變成unicode了,並且會儲存在對應的pyc檔案中。
所以兩者的區別其實就是什麼時候變成unicode,而且作為引數傳遞時有u的直接就是unicode物件了,而沒有u的只是python中的普通的str, 需要變成unicode來用時需要呼叫decode或者unicode函式來處理。兩者的聯絡就是他們的最終結果都是unicode。
3. 檔案的編碼
3.1 在編碼問題中,其實檔案本身的編碼也是很重要的。如何檢視?用vim的話,可以通過在vimrc檔案加入'set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1' 來檢測檔案的編碼格式,會按照你列的編碼順序來檢測該檔案的編碼。具體做法是加入那句以後,用vim開啟該檔案後,用set fileencoding來檢視。
3.2 檔案的編碼其實就決定了你在檔案中寫一句 s = '中文'的時候,這個s的值是什麼編碼。也就是說,如果檔案編碼是gbk,那麼s就是gbk編碼,你要變成unicode來用就要s.decode('gbk').
4. python檔案中的中文有人是建議都用u'xx'的寫法變成unicode,然後在需要轉換顯示的時候才轉,我表示同意。
流程圖 reference :
遇到的問題的例子比較多,這裡不一一枚舉了,找了幾個比較好的參考資料
1.
2. 3.
4. 5. 用******json 來轉換資料:
******json提供兩類api:
1) loads: 將python的object轉化成字串()
2) dumps : 將字串轉化成python的object.
loads明顯是有個encode的過程, 那麼肯定有個encoding來指定encode時候的編碼, 不指定預設是用utf-8的;
同樣dumps明顯就有個decode過程, 同樣有個encoding來指定, 預設也是為utf-8;
以前遇到乙個問題是, 通過http介面獲取過來的json資料編碼是gbk的, 但是我在loads的時候沒有指定encoding,
結果出現亂碼, 找了很久才發現了問題, 所以我警惕之後呼叫這2個介面的時候都最好顯示指定encoding,這樣
雖然麻煩了, 但是對於查詢問題和**可讀性方面都是有好處的!
經驗是如果遇到編碼問題,可以從一下幾個方面去思考:
1)檔案本身的 編碼
2)宣告的編碼
3)如果資料是從網路獲取的或者其他途徑,反正就不是自己的,那麼建議**中加入try...except unicodeencodeerror, unicodedecodeerror 之類的**做好防範。
4)建議採用utf-8編碼,如果實在是對資料量有要求的可以用gbk,因為小一點。
歡迎拍磚!
Python 編碼總結
python裡面中文亂碼問題乙個讓初學者很頭痛的問題,自己在做專案的時候也遇到不少的編碼問題,在這裡做乙個小小的總結。1.編碼轉換 python內部使用unicode作為預設編碼來表示字串 string 在編碼轉換的過程中,將unicode作為中間編碼進行過度是乙個本質的思想。fromcode un...
python 編碼問題總結
python 編碼問題總結 2010 05 12 15 07 問題一 當python中間處理非ascii編碼時,經常會出現如下錯誤 unicodedecodeerror ascii codec can t decode byte 0x?in position 1 ordinal not in ran...
python 編碼方式總結
python 編碼方式總結 python 內部使用 unicode 編碼 t 北京 t xe5 x8c x97 xe4 xba xac 1 urllib.quote t 將t轉換為 16進製制編碼 e5 8c 97 e4 ba ac urllib.unquote e5 8c 97 e4 ba ac ...