標籤:文本編輯 儲存檔案 文本 檔案 import art encoding ica 還原
一、三種編碼方式
- ASCII:是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多隻能用 8 位來表示(一個位元組),即:2**8 = 256-1,所以,ASCII碼最多隻能表示 255 個符號。
- Unicode(統一碼、萬國碼、單一碼):是一種在電腦上使用的字元編碼,規定所有的字元和符號最少由 16 位來表示(2個位元組),即:2 **16 = 65536。
- UTF-8: 是對Unicode編碼的壓縮和最佳化,他不再使用最少使用2個位元組,而是將所有的字元和符號進行分類:ascii碼中的內容用1個位元組儲存、歐洲的字元用2個位元組儲存,東亞的字元用3個位元組儲存。utf8,因為是可變長位元組的編碼方式,所以隱藏檔時就會節省大量空間,同時相容ASCII碼。
詳細文章:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html (py編碼終極版)
一言以蔽之:Unicode是記憶體編碼錶示方案(是規範),而UTF是如何儲存和傳輸Unicode的方案(是實現)這也是UTF與Unicode的區別。
在。
二、檔案從磁碟到記憶體的編碼
那當我們儲存了存到磁碟上的資料又是什麼呢?
答案是通過某種編碼方式編碼的bytes位元組串。比如utf8---一種可變長編碼,很好的節省了空間;當然還有曆史產物的gbk編碼等等。於是,在我們的文字編輯器軟體都有預設的儲存檔案的編碼方式,比如utf8,比如gbk。當我們點擊儲存的時候,這些編輯軟體已經"默默地"幫我們做了編碼工作。
那當我們再開啟這個檔案時,軟體又默默地給我們做瞭解碼的工作,將資料再解碼成unicode,然後就可以呈現明文給使用者了!
所以,unicode是離使用者更近的資料,bytes是離電腦更近的資料。
說了這麼多,和我們程式執行有什麼關係呢?
先明確一個概念:py解譯器本身就是一個軟體,一個類似於文字編輯器一樣的軟體!
現在讓我們一起還原一個py檔案從建立到執行的編碼過程:
開啟pycharm,建立hello.py檔案,寫入
ret=1+1s=‘苑昊‘print(s)
當我們儲存的的時候,hello.py檔案就以pycharm預設的編碼方式儲存到了磁碟;關閉檔案後再開啟,pycharm就再以預設的編碼方式對該檔案開啟後讀到的內容進行解碼,轉成unicode到記憶體我們就看到了我們的明文;
而如果我們點擊運行按鈕或者在命令列運行該檔案時,py解譯器這個軟體就會被調用,開啟檔案,然後解碼存在磁碟上的bytes資料成unicode資料,這個過程和編輯器是一樣的,不同的是解譯器會再將這些unicode資料翻譯成C代碼再轉成二進位的資料流,最後通過控制作業系統調用cpu來執行這些位元據,整個過程才算結束。
那麼問題來了,我們的文字編輯器有自己預設的編碼解碼方式,我們的解譯器有嗎?
當然有啦,py2預設ASCII碼,py3預設的utf8,可以通過如下方式查詢
1 import sys2 print(sys.getdefaultencoding())
大家還記得這個聲明嗎?
1 #coding:utf8
是的,這就是因為如果py2解譯器去執行一個utf8編碼的檔案,就會以預設地ASCII去解碼utf8,一旦程式中有中文,自然就解碼錯誤了,所以我們在檔案開頭位置聲明 #coding:utf8,其實就是告訴解譯器,你不要以預設的編碼方式去解碼這個檔案,而是以utf8來解碼。而py3的解譯器因為預設utf8編碼,所以就方便很多了。
二、轉碼
需知:
1.在python2預設編碼是ASCII, python3裡預設是utf-8
2.unicode 分為 utf-32(佔4個位元組),utf-16(佔兩個位元組),utf-8(佔1-4個位元組), so utf-8就是unicode
3.在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
1 #-*-coding:utf-8-*- 2 __author__ = ‘Alex Li‘ 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 8 msg = "我愛北京天安門" 9 msg_gb2312 = msg.decode("utf-8").encode("gb2312")10 gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")11 12 print(msg)13 print(msg_gb2312)14 print(gb2312_to_gbk)in python2
1 #-*-coding:gb2312 -*- #這個也可以去掉 2 __author__ = ‘Alex Li‘ 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 8 msg = "我愛北京天安門" 9 #msg_gb2312 = msg.decode("utf-8").encode("gb2312")10 msg_gb2312 = msg.encode("gb2312") #預設就是unicode,不用再decode,喜大普奔11 gb2312_to_unicode = msg_gb2312.decode("gb2312")12 gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")13 14 print(msg)15 print(msg_gb2312)16 print(gb2312_to_unicode)17 print(gb2312_to_utf8)in python3
004-python基礎-字元編碼與轉碼