【Python3之字元編碼】

來源:互聯網
上載者:User

標籤:bsp   python2   node   字母   and   inux   程式   擴充   空間換時間   

一、字元集和字元編碼1.定義

  電腦中儲存的資訊都是用位元表示的,而我們在螢幕上看到的英文、漢字等字元是位元轉換之後的結果。通俗的說,按照何種規則將字元儲存在電腦中,如‘a‘用什麼表示,稱為"編碼";反之,將儲存在電腦中的位元解析顯示出來,稱為"解碼",如同密碼學中的加密和解密。在解碼過程中,如果使用了錯誤的解碼規則,則導致‘a‘解析成‘b‘或者亂碼。

字元(Character):是一個資訊單位,在電腦裡面,一個中文漢字是一個字元,一個英文字母是一個字元,一個阿拉伯數字是一個字元,一個標點符號也是一個字元。

字元集(Charset):是一個系統支援的所有抽象字元的集合。通常以二維表的形式存在,二維表的內容和大小是由使用者的語言而定,可以是英語,是漢語,或者阿拉伯語。

字元編碼(Character Encoding):是一套法則,使用該法則能夠對自然語言的字元的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈衝)進行配對。在這裡我們把字元集中的字元編碼為特定的位元,以便在電腦中儲存。編碼方式一般就是對二維表的橫縱座標進行變換的演算法。即在符號集合與數字系統之間建立對應關係,它是資訊處理的一項基本技術。即:字元--------(翻譯過程)------->位元

 

2.常用的字元集和字元編碼

字元集和字元編碼一般都是成對出現的,如ASCII、GBK、Unicode、UTF-8等,都是即表示了字元集又表示了對應的字元編碼,以後統稱為編碼。

 

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.

 

【Python3之字元編碼】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.