編碼一直都是乙個很讓人頭疼的問題,尤其是在python裡面。花了幾天時間,終於把這個問題給弄明白了。
一,什麼是編碼,編碼過程是怎樣的?常見的編碼方式有哪些?
編碼是從乙個字元,比如『哈』,到一段二進位製碼流的過程。解碼是從一段二進位製碼流到乙個字元的過程。
在編碼的過程中,會涉及到三個名詞:字元,內碼,字符集。字元就是終端上顯示的各個文字字母等。內碼和字元是一一對應的關係。每乙個字元都對應乙個唯一的內碼。內碼在記憶體中的具體實現稱為字符集。
注意:嚴格來說,編碼指內碼編碼成字符集;解碼指字符集解碼為內碼。
ascii不僅僅指英文對應的內碼,還包括它的具體實現,也就是它的字符集。它是用乙個位元組儲存每個內碼的。
unicode是所有文字(包括英文,中文,日文等)所對應的內碼的集合。
unicode的實現方式比較多樣,常用的有utf-8,gbk,gb18030。
其中,utf-8是一種不定長的內碼實現方式。
gb18030相容gbk,gbk相容gb2312。
二,系統編碼方式查詢更改命令有哪些?(linux)
locale是最核心的乙個變數。它包括12個基本屬性。這12個基本屬性構成某個地區的語言習慣,日期,貨幣,單位等文化因素。lc_all是強制修改locale資訊的命令。lang是locale的預設設定命令。因此,當lc_all強制locale資訊以後,lang的設定也就失效了。
三,python中的編碼問題
在python中,需要分清楚三種編碼:系統編碼,python編碼,檔案編碼。先面說一下這三種編碼的作用。
系統編碼,通常也是寫原始碼的編輯器的編碼方式。它代表原始碼檔案內的所有內容都是根據詞方式編碼成二進位製碼流,存入到磁碟中的。
系統編碼可以通過locale命令檢視(linux)。
python編碼,是指python內設定的解碼方式。如果不設定的話,python預設是ascii解碼。它的設定方式有一下三種:
第一種:在原始碼檔案開頭(一定要是第一行):#coding=utf-8,原始碼檔案的設定解碼方式為utf-8
第二種:在原始碼檔案開頭(一定是第一行):#-*-coding:utf-8-*-,原始碼檔案的設定解碼方式是utf-8
第三種:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
個人推薦前兩種。前兩種的區別在於,第二種能夠被其他語言識別,第一種只使用於python
下面舉例說明系統編碼和python編碼的作用。
系統編碼:locale:gbk
python原始檔test.py
#coding='utf-8'
s='哈'
print s
在test.py儲存的時候,會按照系統編碼方式gbk的方式,編碼成gbk二進位製碼流,儲存到磁碟上。當執行該程式時。gbk二進位製碼流調入記憶體,並按照python設定的解碼方式解碼,也就是按照utf-8的方式解碼。所以,原始檔中的漢字「哈」顯示按照gbk方式,編碼成二進位製碼流,然後按照utf-8的方式解碼成unicode內碼。可以想象,結果不是錯誤提示,就是顯示出來的是亂碼。
還有一種情況需要用到python的預設解碼方式。例如:
系統編碼:locale:gbk
test.py
#coding='gbk'
s='哈'
ss=s.encode('utf-8')
字串s表示的是漢字「哈」的gbk編碼的二進位製碼流(python中,所有字串都表示的是相應的二進位製碼流,所有的unicode都表示的是相應的內碼)。ss=s.encode('utf-8')的過程中,會先對s的二進位製碼流,按照python設定的預設解碼方式解碼成unicode內碼,然後對內碼按照encode指定的編碼方式編碼。
在字串的處理過程中,記住一句話:對二進位製碼流,按照解碼的編碼處理。怎麼理解這句話呢?
例如:print s
字串s表示的是二進位製碼流,print函式把它交給系統,系統按照系統的編碼方式解碼餅顯示。當然,如果系統的解碼方式和s的編碼方式不相容的話,可能會報錯或者亂碼。
再例如:
f.write("%s\r\n"%str)
字串str表示的是二進位製碼流,f是開啟的指定檔案。str二進位製碼流按照f檔案的編碼方式進行解碼和編碼,結果儲存在f檔案中。
為了安全起見,檔案在開啟的時候,最後指定檔案編碼方式
字串和unicode的區別
字串表示的是編碼後的二進位製碼流,unicode表示的是內碼。所以,為了避免解碼錯誤的出現,最好使用unicode表示
unicode的定義,使用
1.s=u'哈':定義unicode字串s。s表示的是哈的unicode內碼
2.ss=unicode(s,'gbk'):對字串s按照gbk方式解碼,ss表示解碼後的內碼
3.import codecs
f=codecs.open(filename,'r','gbk『)
s=f.read()
按照gbk方式讀取filename,讀取後的內容轉變成unicode內碼存在變數s中。
好了,記住上面這些,python中碰到編碼問題,再也不會害怕了
編碼系統python 系統編碼 python編碼
系統編碼 python編碼 2013 09 30 11 38 23 標籤 python編碼 編碼一直都是乙個很讓人頭疼的問題,尤其是在python裡面。花了幾天時間,終於把這個問題給弄明白了。一,什麼是編碼,編碼過程是怎樣的?常見的編碼方式有哪些?編碼是從乙個字元,比如 哈 到一段二進位製碼流的過程...
linux 系統編碼
一。linux系統的預設編碼設定。etc sysconfig i18n controls the system font settings.the language variables are used in etc profile.d lang.sh.an example i18n file la...
linux 系統編碼
一。linux系統的預設編碼設定。etc sysconfig i18n controls the system font settings.the language variables are used in etc profile.d lang.sh.an example i18n file la...