1. 程式人生 > >第7天字符編碼

第7天字符編碼

因此 sci 執行過程 python2 寫入 什麽是 其他 utf-8 內容

什麽是字符編碼?

  計算機只能識別0和1,當我們與計算機進行交互的時候不可能通過0和1進行交互,因此我們需要一張表把我們人類的語言一一對應成計算機能夠識別的語言,這張表就是我們通常所說的字符編碼表。因為計算機是美國人發明的,在設計之初的時候並未考慮到全世界的情況,所以最開始只有一張ASCII表(這個表只是英文和計算機識別語言的一一對應),隨著計算機的普及,為了使用計算機,各國陸陸續續的又出現了很多自己國家的字符編碼表,但是這樣就造成了另外一種現象,就是亂碼。當中國使用外國的軟件的時候,由於編碼表不一樣的問題導致無法解碼出正確的字符,從而出現亂碼。為了解決這樣的問題,出現了一個叫做unicode的萬國碼,把世界上所有的語言通過這一張表一一映射,這樣亂碼的問題就解決了。但是unicode由於所占字節過大,為了節省空間從而達到減少IO操作時間的目的,又出現了一種變長編碼方式utf-8(unicode transform format)

,它只是unicode的一種轉換格式,和世界上其他的語言沒有一一對應關系,目前現狀來看,計算機內存中使用的編碼方式是unicode。所以在我們進行編碼和解碼的過程中,如果出現了各國語言不一致的問題,我們需要通過unicode進行轉換。

目前有的字符編碼

技術分享圖片

軟件執行文件的三步驟,python解釋器也一樣

技術分享圖片

文件存入硬盤的過程(nodpad++為例)

結論:存文件的過程中不能出錯,一旦存錯就算是相同的編碼方式也是解碼不了的。

第一步:打開軟件,也就是操作系統把軟件添加到內存中

第二步:輸入內容,此時所有的內容都是存在內存中的(先更改字符編碼集,然後在寫入內容),當我們編碼改成日文的時候會發現目前我們依然能夠看到是不亂碼的,那是因為在內存中都是以unicode的形式編碼的,無論是哪一國的語言都是可以顯示的。

技術分享圖片

第三步:點擊保存按鈕,把內容保存在硬盤上面

第四步:以同樣的編碼方式重新打開的時候發現中文出現亂碼

技術分享圖片

python讀取文件的三個步驟

第一步:打開python解釋器,加載到內存,沒有實際文件的編碼和解碼過程

第二步:python當作一個文本編輯器去從硬盤中加載文件到內存,此時不會關註語法,但是有解碼的過程。因此當初存文件的時候的編碼和解碼是否一樣決定是否會報錯。

python2默認編碼方式為ASCII
python3默認編碼方式為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天字符編碼