標籤:代碼 style 開啟 內容 str src 通過 出現 color
什麼是字元編碼?
電腦只能識別0和1,當我們與電腦進行互動的時候不可能通過0和1進行互動,因此我們需要一張表把我們人類的語言一一對應成電腦能夠識別的語言,這張表就是我們通常所說的字元編碼表。因為電腦是美國人發明的,在設計之初的時候並未考慮到全世界的情況,所以最開始只有一張ASCII表(這個表只是英文和電腦識別語言的一一對應),隨著電腦的普及,為了使用電腦,各國陸陸續續的又出現了很多自己國家的字元編碼表,但是這樣就造成了另外一種現象,就是亂碼。當中國使用外國的軟體的時候,由於編碼錶不一樣的問題導致無法解碼出正確的字元,從而出現亂碼。為瞭解決這樣的問題,出現了一個叫做unicode的萬國碼,把世界上所有的語言通過這一張表一一映射,這樣亂碼的問題就解決了。但是unicode由於所佔位元組過大,為了節省空間的從而達到減少IO操作時間的目的,又出現了一種變長編碼方式utf-8(unicode transform format),它只是unicode的一種轉換格式,和世界上其他的語言沒有一一對應關係,目前現狀來看,電腦記憶體中使用的編碼方式是unicode。所以在我們進行編碼和解碼的過程中,如果出現了各國語言不一致的問題,我們需要通過unicode進行轉換。
目前有的字元編碼
軟體執行檔案的三步驟,python解譯器也一樣
檔案存入硬碟的過程(nodpad++為例)
結論:存檔案的過程中不能出錯,一旦存錯就算是相同的編碼方式也是解碼不了的。
第一步:開啟軟體,也就是作業系統把軟體添加到記憶體中
第二步:輸入內容,此時所有的內容都是存在記憶體中的(先更改字元編碼集,然後在寫入內容),當我們編碼改成日文的時候會發現目前我們依然能夠看到是不亂碼的,那是因為在記憶體中都是以unicode的形式編碼的,無論是哪一國的語言都是可以顯示的。
第三步:點擊儲存按鈕,把內容儲存在硬碟上面
第四步:以同樣的編碼方式重新開啟的時候發現中文出現亂碼
python讀取檔案的三個步驟
第一步:開啟python解譯器,載入到記憶體,沒有實際檔案的編碼和解碼過程
第二步:python當作一個文字編輯器去從硬碟中負載檔案到記憶體,此時不會關注文法,但是有解碼的過程。因此當初存檔案的時候的編碼和解碼是否一樣決定是否會報錯。
python2預設編碼方式為ASCIIpython3預設編碼方式為utf-8
左邊是一個以gbk的方式儲存的檔案,右邊通過python3和python2分別去執行檔案都會報錯,這個是在第二步讀取檔案就會出現的錯誤,因為python2和python3預設編碼方式都不是gbk,因此在載入到記憶體這一步就出現了錯誤
在前面加上了一行字元,表示告訴解譯器當在讀取檔案的時候應該用哪中編碼方式,這樣在載入到記憶體這一步就不會出錯了。報錯的原因並不是字元編碼的問題,而是程式的文法問題,也就是第三步了。
當前兩步執行完成之後,檔案中的內容就以unicode的方式存在了記憶體中。
接下來開始執行第三部,也就是python文法的檢測(在這一步的處理python2和python3是不一樣的):
為什麼python2和python3在這一步不一樣呢?代碼存在與記憶體中是要存兩份的,第一份就是在第二步(在未執行代碼之前)從檔案中讀取出來的代碼是以unicode的方式存在於記憶體中的,第二份就是在代碼的執行過程中會對字串重新申請一份記憶體空間,而這份記憶體空間是以什麼樣的編碼方式儲存的是與python的解譯器有關係的!
print函數
print函數列印的時候預設是以終端的編碼格式列印的!
python3
當python3讀到 s = ‘你瞅啥‘ 會重新申請一份記憶體空間然後把 ‘你瞅啥’ 以unicode的方式儲存起來。(所以說無論終端是以什麼樣的編碼格式列印的都是不會出現亂碼的)
# 下面這段代碼無論放在哪裡都是可以執行出來結果的,因為記憶體中的都是unicode編碼#_*_coding:gbk_*_s = ‘你愁啥‘print(s, type(s))
#_*_coding:gbk_*_s = ‘你愁啥‘print(s, type(s))
#s可以直接encode成任意編碼格式print(s.encode(‘gbk‘)) print(type(s.encode(‘gbk‘))) #<class ‘bytes‘>
python2
當python2讀到 s = ‘你瞅啥‘ 預設會重新申請一份記憶體空間然後把 ‘你瞅啥’ 以最上面一行的編碼方式儲存
# 如果是python2運行此代碼,當運行到s = ‘你瞅啥‘ 的時候會新開闢一個記憶體空間以gbk的格式存進去
# 所以列印終端必須是gbk,否則會出現錯誤
#_*_coding:gbk_*_s = ‘你愁啥‘print(s, type(s))
# 如果是python2的話一般會在字串前面加上u,直接把字串解碼成unicode格式#_*_coding:gbk_*_s = u‘你愁啥‘ # 相當於執行了 s = ‘你瞅啥‘.decode(‘gbk‘)print(s, type(s))
第7天字元編碼