Python中的Unicode編碼和UTF-8編碼


下午看廖雪峰的Python2.7教程,看到 字符串和編碼 一節,有一點感受,結合 崔慶才的Python博客 ,把這種感受記錄下來:

 

ASCII碼:是用一個字節(8bit, 0-255)中的127個字母表示大小寫字母,數字和一些符號.主要用來表示現代英語和西歐語言。

所以處理中文就出現問題了,因為中文處理至少需要兩個字節,所以中國制定了GB2312。

所以,各國制定了各國的標准。日本制定了Shift_JIS,韓國制定了Euc-kr。。。那么,亂碼就來了。

 

為了統一,Unicode誕生了。統一碼把所有語言都統一到一套編碼里。解決了亂碼問題,但是存儲和傳輸效率低下的問題又來了。

因為ASCII編碼是1個字節,而Unicode編碼通常是2個字節。你表示一個英文字母一個字節就夠了,但是Unicode卻不得不用兩個字節來表示(另一個字節補0)。

 

為了節約,出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間(ASCII碼可以看成是UTF-8的一部分,所以大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作)。

 

現在如果我要用Notepad編輯一個python的腳本,我打開文件的過程中,內存中就開辟了一段空間,來臨時存儲我保存的代碼,在計算機內存中,統一使用Unicode編碼。

所以我寫的中文字符串,要在前面加u表示是Unicode編碼的字符串。

靜覓博客中也是:

但是為什么有時候,我們要用到decode('utf-8'),再結合靜覓博客來看:

因為糗事百科的服務器發送給客戶端(也就是瀏覽器)的響應的編碼就是‘UTF-8':

為了在文本編輯(讀取文本)時,內存中需要Unicode編碼,所以用decode('utf-8')解碼,把UTF-8轉化為Unicode編碼(同理,encode('utf-8')是把Unicode轉化為UTF-8編碼)。

當保存文本到保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼,所以我們需要在python腳本開頭定義#-*-coding:utf-8-*-

 

 圖片來源

廖雪峰的官方網站:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819196283586a37629844456ca7e5a7faa9b94ee8000

靜覓 崔慶才的個人博客:http://cuiqingcai.com/990.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM