1. 程式人生 > >第七章、Python字符編碼

第七章、Python字符編碼

編碼格式 點擊 這一 浪費 end 定性 支持 開始 can

第七章、Python字符編碼

一、定義

計算機中儲存的信息都是用二進制數表示的,而我們在屏幕上看到的英文、漢字等字符是二進制數轉換之後的結果。通俗的說,按照何種規則將字符存儲在計算機中,如‘a‘用什麽表示,稱為"編碼";反之,將存儲在計算機中的二進制數解析顯示出來,稱為"解碼",如同密碼學中的加密和解密。在解碼過程中,如果使用了錯誤的解碼規則,則導致‘a‘解析成‘b‘或者亂碼。

  • 字符(Character):是一個信息單位,在計算機裏面,一個中文漢字是一個字符,一個英文字母是一個字符,一個阿拉伯數字是一個字符,一個標點符號也是一個字符。
  • 字符集(Charset):是一個系統支持的所有抽象字符的集合。通常以二維表的形式存在,二維表的內容和大小是由使用者的語言而定,可以是英語,是漢語,或者阿拉伯語。
  • 字符編碼(Character Encoding):是一套法則,使用該法則能夠對自然語言的字符的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈沖)進行配對。在這裏我們把字符集中的字符編碼為特定的二進制數,以便在計算機中存儲。編碼方式一般就是對二維表的橫縱坐標進行變換的算法。即在符號集合與數字系統之間建立對應關系,它是信息處理的一項基本技術。即:字符--------(翻譯過程)------->二進制數

二、常用的字符集和字符編碼

字符集和字符編碼一般都是成對出現的,如ASCIIGBKUnicodeUTF-8等,都是即表示了字符集又表示了對應的字符編碼,以後統稱為編碼

三、字符編碼的發展史

  • 第一階段:起源,ASCII

計算機是美國人發明的,人家用的是美式英語,字符比較少,所以一開始就設計了一個不大的二維表,128個字符,取名叫ASCII(American Standard Code for Information Interchange)。但是7位編碼的字符集只能支持128個字符,為了表示更多的歐洲常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符。即其最多只能用 8 位來表示(一個字節)。

  • 第二階段:GBK

當計算機傳到了亞洲,尤其是東亞,國際標準被秒殺了,路邊小孩隨便說句話,256個碼位就不夠用了。於是,中國定制了GBK。用2個字節代表一個字符(漢字)。其他國家也紛紛定制了自己的編碼,例如:

日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏。

  • 第三階段:unicode  

當互聯網席卷了全球,地域限制被打破了,不同國家和地區的計算機在交換數據的過程中,就會出現亂碼的問題,跟語言上的地理隔離差不多。為了解決這個問題,一個偉大的創想產生了——Unicode(萬國碼)。Unicode編碼系統為表達任意語言的任意字符而設計。  

規定所有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,註:此處說的的是至少2個字節(16位),可能更多。

  • 第四階段:UTF-8

unicode的編碼方式雖然包容萬國,但是對於英文等字符就會浪費太多存儲空間。於是出現了UTF-8,是對Unicode編碼的壓縮和優化,遵循能用最少的表示就用最少的表示,他不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存。

補充:

  • unicode:包容萬國,優點是字符->數字的轉換速度快,缺點是占用空間大

  • utf-8:精準,對不同的字符用不同的長度表示,優點是節省空間,缺點是:字符->數字的轉換速度慢,因為每次都需要計算出字符需要多長的Bytes才能夠準確表示

內存中使用的編碼是unicode,用空間換時間,為了快因為程序都需要加載到內存才能運行,因而內存應該是盡可能的保證快。

硬盤中或者網絡傳輸用utf-8,網絡I/O延遲或磁盤I/O延遲要遠大與utf-8的轉換延遲,而且I/O應該是盡可能地節省帶寬,保證數據傳輸的穩定性。因為數據的傳輸,追求的是穩定,高效,數據量越小數據傳輸就越靠譜,於是都轉成utf-8格式的,而不是unicode。

技術分享圖片 技術分享圖片

四、字符編碼的使用

  • 1) 文本編輯器存取文件的原理(nodepad++,pycharm,word)

    • 打開編輯器就打開了啟動了一個進程,是在內存中的,所以在編輯器編寫的內容也都是存放與內存中的,斷電後數據丟失。因而需要保存到硬盤上,點擊保存按鈕,就從內存中把數據刷到了硬盤上。在這一點上,我們編寫一個py文件(沒有執行),跟編寫其他文件沒有任何區別,都只是在編寫一堆字符而已。

    • 無論是何種編輯器,要防止文件出現亂碼,核心法則就是,文件以什麽編碼保存的,就以什麽編碼方式打開。

  • 2) python解釋器執行py文件的原理 (python test.py)

    • 第一階段:python解釋器啟動,此時就相當於啟動了一個文本編輯器

    • 第二階段:python解釋器相當於文本編輯器,去打開test.py文件,從硬盤上將test.py的文件內容讀入到內存中

    • 第三階段:python解釋器解釋執行剛剛加載到內存中test.py的代碼

補充

所以,在寫代碼時,為了不出現亂碼,推薦使用UTF-8,會加入

# -*- coding: utf-8 -*-

#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
print "你好,世界"

python解釋器會讀取test.py的第二行內容,# -- coding: utf-8 --,來決定以什麽編碼格式來讀入內存,這一行就是來設定python解釋器這個軟件的編碼使用的編碼格式這個編碼。

如果不在python文件指定頭信息#--coding:utf-8--,那就使用默認的python2中默認使用ascii,python3中默認使用utf-8

總結:

1)python解釋器是解釋執行文件內容的,因而python解釋器具備讀py文件的功能,這一點與文本編輯器一樣

2)與文本編輯器不一樣的地方在於,python解釋器不僅可以讀文件內容,還可以執行文件內容

第七章、Python字符編碼