標籤:儲存空間 分析 起源 name style 列印 字串 div 類型
一、瞭解字元編碼的知識儲備
1、電腦基礎知識(三副圖)
2、文字編輯器存取檔案的原理(notepad++,Pycharm,word)
開啟編輯器就啟動了一個進程,是在記憶體中啟動並執行,所以在編輯器寫的內容在沒儲存之前都是存放在記憶體中的,斷電後資料就會丟失。因而需要儲存到硬碟上,點擊儲存按鈕,就從記憶體中把資料刷到硬碟上。
3、Python解譯器執行py檔案的與原理,例如python test.py
第一階段:python解譯器啟動,此時就相當於啟動了一個文字編輯器。
第二階段:python解譯器相當於文字編輯器,去開啟test.py檔案,從硬碟將test.py的檔案內容讀到記憶體中。
第三階段:python解譯器解釋執行剛剛載入到記憶體中test.py的代碼。(PS:在該階段,即執行時,才會識別python的文法,執行檔案內代碼,執行到name=‘tracy‘,會開闢記憶體空間存放字串‘tracy‘)
總結:python解譯器與文字編輯器的異同
相同點:python解譯器是執行檔案內容的,因而python解譯器具備都py檔案的功能,這一點與文字編輯器一樣
不同點:文字編輯器將檔案內容讀入記憶體後,是未來顯示/編輯,而python解譯器將檔案讀入記憶體後,是為了執行(識別python文法)
二、什麼是字元編碼
電腦要想工作必須通電,也就是說電驅使電腦幹活,而電的特性,就是高低電平。(高低電平即位元1,低電平即二進位0),也就是說電腦只認識數字。
如何能讓電腦讀懂人類的字元?
字元----->(翻譯過程)------>數字
這個過程實際就是一個字元如何對應一個特定數位標準,這個標準稱之為字元編碼。
三、字元編碼的發展史
階段一:現代電腦起源於美國,最早誕生也是基於英文考慮的ASCII
ASCII:一個Bytes代表一個字元(英文字元/鍵盤上的所有其他字元),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可表示256個字元。
階段二:為了滿足中文,中國人定製了GBK
GBK:2Bytes代表一個字元
階段三:日本人定製了Shift_JIS,韓國人定製了Euc-kr等等
小結:各國有各國的標準,就會有不可避免的衝突,結果就是,在多語言混合的文本中,顯示出來就會有亂碼。
於是產生了Unicode,同意用2B有特色代表一個字元,2**16-1=65535,可代表6萬多個字元,因而相容萬國語言。
但是對於通篇都是英文的文本來說,這種編碼方式無疑是多了一倍的儲存空間。於是產生了utf-8,對英文字元只用1Bytes表示,對中文字元用3Bytes表示。
unicode特性:簡單粗暴,所有字元都是2Bytes,優點是字元->數位轉換速度快,缺點是佔用空間打。
utf-8特性:精準,對不同的字元用不同的長度表示,有點是節省空間的,缺點是:字元-->數位轉換速度慢,因為每次都需要計算出字元需要多長的Bytes才能夠準確表示。
記憶體中使用的編碼是Unicode,用空間換時間。
硬碟中或者網路傳輸用utf-8,網路I/O延遲或者磁碟I/O延遲要遠大於utf-8的轉換延遲,而且I/O應該是儘可能地節省頻寬,保證資料轉送的穩定性。
四、字元編碼的使用
文字編輯器轉換圖
Unicode--->encode----->utf-8
uft-8--------->decode----->Unicode
分析字元轉換過程:
檔案從記憶體刷到硬碟的操作簡稱存檔案
檔案從硬碟讀到記憶體的操作簡稱讀檔案
分析亂碼:
1、存檔案時就已經亂碼的情況;
2、存檔案時不亂碼而讀檔案時亂碼;
小結:
無論是何種編輯器,要防止檔案出現亂碼(請一定注意,存放一段代碼的檔案也僅僅只是一個普通檔案而已,此處指的是檔案沒有執行前,我們開啟檔案時出現的亂碼)
核心法則就是,檔案以什麼編碼儲存的,就以什麼編碼方式開啟。
python2預設ASCII,python3預設utf-8,除非檔案頭部指定編碼方式。
針對python3如;
在瀏覽網頁的時候,伺服器會吧動態產生的Unicode內容轉換為UTF-8再傳輸到瀏覽器
如果服務端encode的編碼格式是utf-8,用戶端記憶體中收到的也是uft-8編碼的二進位。
在python3中也有兩種字串類型str和bytes
str是Unicode
#coding:utf-8
s=‘林‘ #當程式執行時,無需加u,‘林‘也會被以unicode形式儲存新的記憶體空間中,#s可以直接encode成任意編碼格式s.encode(‘utf-8‘)s.encode(‘gbk‘)print(type(s)) #<class ‘str‘>
bytes是bytes
#coding:utf-8s=‘林‘ #當程式執行時,無需加u,‘林‘也會被以unicode形式儲存新的記憶體空間中,#s可以直接encode成任意編碼格式s1=s.encode(‘utf-8‘)s2=s.encode(‘gbk‘)print(s) #林print(s1) #b‘\xe6\x9e\x97‘ 在python3中,是什麼就列印什麼print(s2) #b‘\xc1\xd6‘ 同上print(type(s)) #<class ‘str‘>print(type(s1)) #<class ‘bytes‘>print(type(s2)) #<class ‘bytes‘>
Python基礎(字元編碼與檔案處理)