標籤: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之字元編碼】