Python_編碼

1.什麼是編碼
首先,將一段文字視爲一個消息,這個消息是以人類可以理解的存在。這種消息又可以稱爲“明文”;
對於說英文的人,打印的或紙張上的英文單詞都算作明文。
其次,計算機中存儲的編碼文本並不是我們可以看懂的明文,那麼可以將編碼文本轉換爲明文的過程稱之爲“解碼”,
將明文轉化爲計算機中的編碼文本的過程稱之爲“編碼”

①.ASCII
計算機中所有的數據,文字、圖片、視頻又或是音頻,本質上最終都是按照類似01010101的二進制存儲的,也就是說計算機只懂二進制。
一個字節只有八位 A–>00010001 其中的一個 0 稱之爲 一個電平,也就是說八個電平作爲一組表示一個字節;
八個電平做爲一組就可以表示出256種不同狀態 所以除了表示英文字符、一些特殊字符和數字外,還可以表示拉丁文。

②GB2312
我黨人員的壯舉,自力更生,將小於127的字符的意義與原來相同(表示英文及一些特殊字符和數字),兩個大於127的字符連接在一起即表示一個漢字;前面的一個字節稱爲高字節(從0xA1用到0xF7)後面的一個字節稱爲低字節(0xA1到0xFE)。Gb2312是對ASCII的中文擴展.
但是漢字太多了,GB2312也不夠用,於是規定:只要第一個字節是大於127就固定表示這是一個漢字的開始,不管後面跟的是不是擴展字符集裏的內容。結果擴展之後的編碼方案被稱爲 GBK 標準,GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。

③UNICODE
很多其它國家都搞出自己的編碼標準,彼此間卻相互不支持。這就帶來了很多問題。於是,國際標誰化組織爲了統一編碼:提出了標準編碼準則:UNICODE 。
UNICODE是用兩個字節來表示爲一個字符,它總共可以組合出65535不同的字符,這足以覆蓋世界上所有符號(包括甲骨文)
④utf8
老外對於國際這頂的 UNICODE編碼不服,我只需要一個字節幹嘛要兼容別人用兩個字節
所以發明了UTF-8(8-bit Unicode Transformation Format) 它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度,當字符在ASCII碼的範圍時,就用一個字節表示,所以是兼容ASCII編碼的
但是在內存中的存儲 都是以UNICODE編碼方式存儲的,但是在數據保存到磁盤或是在網絡傳輸時,使用utf8要比unicode節省很多空間。

關於Unicode與utf8的關係:
Unicode是內存編碼表示方案(是規範),而UTF是如何保存和傳輸Unicode的方案(是實現)這也是UTF與Unicode的區別。

s="I'm 帥哥"
# unicode
I      00000000 01001001
'      00000000 00100111
m      00000000 01101101
       00000000 00100000
帥     10000010 11010001
哥     01100110 00001010

這個字符串總共佔用了12個字節,英文的前9爲都是0!

#utf8
I    01001001
'    00100111
m    01101101
     00100000
帥   11101000 10001011 10010001
哥   11100110 10011000 10001010

utf8用了10個字節,因爲我們程序的英文遠多於中文,所以空間提升會很多。(節省硬盤空間及流量)
2.Python3編碼

import json
a = "帥哥"
print(type(a)) #<class 'str'>
print(json.dumps(a)) #"\u5e05\u54e5"

b = a.encode('utf8') # 編碼(encode)
print(type(b)) #<class 'bytes'>
print(b) #b'\xe5\xb8\x85\xe5\x93\xa5'

c = b.decode('utf8') # 解碼(decode)
print(type(c)) #<class 'str'>
print(c)#帥哥
print(json.dumps(c)) #"\u5e05\u54e5"

Python3 對文本和二進制數據做了類型的區分,不會對bytes字節串進行自動解碼,也不會以任意隱式的方式混用str和bytes.

3.從磁盤到內存的編碼
當我們使用任意一款編譯器時,編輯的文字或是英文等,在未保存之前都是以unicode編碼方式存在的(萬國碼,世界上的任何字符它都有唯一編碼對應,所以兼容性是最好的),
當我們保存後,其存入磁盤後,是以某種編碼方式存在的bytes字節串,如utf8編碼、gbk編碼;
當我們打開這個文件時,編譯器自動的將數據解碼爲unicode,然後就可以呈現給用戶了;

同理,Pycharm也是一款編譯器,計算機本身的操作系統也具備編譯器的功能。
py2默認ASCII碼,py3默認的utf8
所以會出現py2解釋器去執行一個utf8編碼的文件,就會以默認地ASCII去解碼utf8,一旦程序中有中文,自然就解碼錯誤了,所以我們在文件開頭位置聲明 #coding:utf8,其實就是告訴解釋器,你不要以默認的編碼方式去解碼這個文件,而是以utf8來解碼。而py3的解釋器因爲默認utf8編碼,所以就方便很多了。

4.常見問題
①:cmd下亂碼問題
當我們創建一個py文件 在電腦終端編譯執行時
在win系統下,python2按照utf8去編碼及保存的,但是當輸出中含有中文,win中的cmd.exe編譯器默認是是按照GBK方式來解碼的,就是說在cmd.exe顯示打印時 會出現問題,本身的文件執行並沒有問題。
py3傳遞出的顯示內容是以unicode數據編碼的,所以顯示沒有問題。
②:open中的編碼問題

# hello文本 :舞舞喳喳
f=open('hello')
print(f.read())

在win下會發生亂碼,在linux下結果正常,也是因爲win系統安裝時時默認GBK編碼的,而linux是utf8編碼;
當win打開並按照GBK編碼去解碼utf8文件時 自然會亂碼。

f= open('hello',encoding= 'utf8')
pint(f.read())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章