Python基礎之字元編碼

來源:互聯網
上載者:User

Python基礎之字元編碼

  一.什麼是字元編碼

  電腦要想工作必須通電,也就是說‘電’驅使電腦幹活,而‘電’的特性,就是高低電壓(高低壓即位元1,低電壓即位元0),也就是說電腦只認識數字

  編程的目的是讓電腦幹活,而編程的結果說白了只是一堆字元,也就是說我們編程最終要實現的是:一堆字元驅動電腦幹活

  所以必須經過一個過程:

  字串--------(翻譯過程)------->數字

  這個過程實際就是一個字元如何對應一個特定數位標準,這個標準稱之為字元編碼

  二.字元編碼分類

  電腦由美國人發明,最早的字元編碼為ASCII,只規定了英文字母數字和一些特殊字元與數位對應關係。最多隻能用 8 位來表示(一個位元組),即:2**8 = 256,所以,ASCII碼最多隻能表示 256 個符號

  當然我們程式設計語言都用英文沒問題,ASCII夠用,但是在處理資料時,不同的國家有不同的語言,日本人會在自己的程式中加入日文,中國人會加入中文。

  而要表示中文,單拿一個位元組表表示一個漢子,是不可能表達完的(連小學生都認識兩千多個漢字),解決方案只有一個,就是一個位元組用>8位2進位代表,位元越多,代表的變化就多,這樣,就可以儘可能多的表達出不通的漢字

  所以中國人規定了自己的標準gb2312編碼,規定了包含中文在內的字元->數位對應關係。

  日本人規定了自己的Shift_JIS編碼

  韓國人規定了自己的Euc-kr編碼(另外,韓國人說,電腦是他們發明的,要求世界統一用韓國編碼)

  這時候問題出現了,精通18國語言的小周同學謙虛的用8國語言寫了一篇文檔,那麼這篇文檔,按照哪國的標準,都會出現亂碼(因為此刻的各種標準都只是規定了自己國家的文字在內的字元跟數位對應關係,如果單純採用一種國家的編碼格式,那麼其餘國家語言的文字在解析時就會出現亂碼)

  所以迫切需要一個世界的標準(能包含全世界的語言)於是unicode應運而生(韓國人表示不服,然後沒有什麼卵用)

  ascii用1個位元組(8位二進位)代表一個字元

  unicode常用2個位元組(16位二進位)代表一個字元,生僻字需要用4個位元組

  例:

  字母x,用ascii表示是十進位的120,二進位0111 1000

  漢字中已經超出了ASCII編碼的範圍,用Unicode編碼是十進位的20013,二進位的01001110 00101101。

  字母x,用unicode表示二進位0000 0000 0111 1000,所以unicode相容ascii,也相容萬國,是世界的標準

  這時候亂碼問題消失了,所有的文檔我們都使用但是新問題出現了,如果我們的文檔通篇都是英文,你用unicode會比ascii耗費多一倍的空間,在儲存和傳輸上十分的低效

  本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間的:

  字元ASCIIUnicodeUTF-8

  A0100000100000000 0100000101000001

  中x01001110 0010110111100100 10111000 10101101

  從上面的表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支援ASCII編碼的曆史遺留軟體可以在UTF-8編碼下繼續工作。

  Python基礎之字元編碼

  三.字元編碼轉換關係

  3.1 程式運行原理

  首先需明確,電腦各組件之間協同工作,資料轉送都是二進位形式,在電腦看來,沒有文字,一切都是位元,電腦運行主要依靠

  cpu:從記憶體中取出二進位指令執行

  記憶體:從硬碟取出位元據提供給cpu運行

  硬碟:將人類認識的文字以二進位的形式存放到磁碟上

  檔案和程式檔案都特麼的是檔案,檔案內容的讀取或者程式的運行都需要把

  程式員開發程式,最終寫了一堆人為定義的人類認為有意義的文字元號表示,以二進位形式儲存到硬碟

  程式運行,作業系統從硬碟上找到存放程式碼的位置,讀取二進位到記憶體

  python解譯器從記憶體裡讀二進位,解釋執行

  3.2 終極揭秘

  首先我們在終端定義一個記憶體變數:name='林海峰',那這個記憶體變數被存放到記憶體(必然是二進位),所以需要一個編碼,就是unicode(記憶體中使用字元編碼固定就是unicode)

  但是如果我們寫到檔案中name='林海峰'儲存到硬碟(必然是二進位),也需要一個編碼,這就跟各個國家有關了,假設我們用gbk,那麼檔案就被以gbk形式儲存到硬碟上了。

  程式要運行:硬碟二進位(gbk)---> 記憶體二進位(unicode)

  就是說,所有程式,最終都要載入到記憶體,程式儲存到硬碟不同的國家用不同的編碼格式,但是到記憶體中我們為了相容萬國(電腦可以運行任何國家的程式原因在於此),統一且固定使用unicode,這就是為何記憶體固定用unicode的原因,你可能會說相容萬國我可以用utf-8啊,可以,完全可以正常工作,之所以不用肯定是unicode比utf-8更高效啊(uicode固定用2個位元組編碼,utf-8則需要計算),但是unicode更浪費空間,沒錯,這就是用空間換時間的一種做法,而存放到硬碟,或者網路傳輸,都需要把unicode轉成utf-8,因為資料的傳輸,追求的是穩定,高效,資料量越小資料轉送就越靠譜,於是都轉成utf-8格式的,而不是unicode。

  gbk->unicode需要decode(),unicode->gbk需要encode()就是這個意思

  瀏覽網頁的時候,伺服器會把動態產生的Unicode內容轉換為UTF-8再傳輸到瀏覽器

  python程式比較特殊,要想運行需要python解譯器去調用,也就相當於python解譯器去讀記憶體的程式的unicode代碼

  因而python解譯器也有個解譯器預設編碼可以用sys.getdefaultencoding()查看,如果不在python檔案指定頭資訊#-*-coding:utf-8-*-,那就使用預設的

  注意了,這個編碼,是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.