【Python3】Python的字符編碼

【Python3】Python的字符編碼

1、字符集和字符編碼

1. 定義

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

字符(Character):是一個信息單位,在計算機裏面,一箇中文漢字是一個字符,一個英文字母是一個字符,一個阿拉伯數字是一個字符,一個標點符號也是一個字符。python

字符集(Charset):是一個系統支持的全部抽象字符的集合。一般以二維表的形式存在,二維表的內容和大小是由使用者的語言而定,能夠是英語,是漢語,或者阿拉伯語。linux

字符編碼(Character Encoding):是一套法則,使用該法則可以對天然語言的字符的一個集合(如字母表或音節表),與其餘東西的一個集合(如號碼或電脈衝)進行配對。在這裏咱們把字符集中的字符編碼爲特定的二進制數,以便在計算機中存儲。編碼方式通常就是對二維表的橫縱座標進行變換的算法。即在符號集合與數字系統之間創建對應關係,它是信息處理的一項基本技術。即:字符--------(翻譯過程)------->二進制數算法

2. 經常使用的字符集和字符編碼

字符集和字符編碼通常都是成對出現的,如ASCII、GBK、Unicode、UTF-8等,都是即表示了字符集又表示了對應的字符編碼,之後統稱爲編碼。windows

3. 字符編碼的發展史

  • 第一階段:起源,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。

以下圖:

字符編碼

4. 字符編碼的使用

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解釋器不只能夠讀文件內容,還能夠執行文件內容

5. python2和python3的一些不一樣

1) python2中默認使用ascii,python3中默認使用utf-8

2) Python2中,str就是編碼後的結果bytes,str=bytes,因此s只能decode。

3) python3中的字符串與python2中的u'字符串',都是unicode,只能encode,因此不管如何打印都不會亂碼,由於能夠理解爲從內存打印到內存,即內存->內存,unicode->unicode

4) python3中,str是unicode,當程序執行時,無需加u,str也會被以unicode形式保存新的內存空間中,str能夠直接encode成任意編碼格式,s.encode('utf-8'),s.encode('gbk')

#unicode(str)-----encode---->utf-8(bytes)
#utf-8(bytes)-----decode---->unicode

5)在windows終端編碼爲gbk,linux是UTF-8.

相關文章
相關標籤/搜索