004-python基礎-字元編碼與轉碼

來源:互聯網
上載者:User

標籤:文本編輯   儲存檔案   文本   檔案   import   art   encoding   ica   還原   

一、三種編碼方式

  1. ASCII:是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多隻能用 8 位來表示(一個位元組),即:2**8 = 256-1,所以,ASCII碼最多隻能表示 255 個符號。
  2. Unicode(統一碼、萬國碼、單一碼):是一種在電腦上使用的字元編碼,規定所有的字元和符號最少由 16 位來表示(2個位元組),即:2 **16 = 65536。
  3. 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基礎-字元編碼與轉碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.