Python基礎:編碼

Coder199發表於2019-03-19

   1:先說python2
py2裡預設編碼是ascii
檔案開頭那個編碼宣告是告訴解釋這個程式碼的程式 以什麼編碼格式 把這段程式碼讀入到記憶體,因為到了記憶體裡,這段程式碼其實是以bytes二進位制格式存的,不過即使是2進位制流,也可以按不同的編碼格式轉成2進位制流,你懂麼?
如果在檔案頭宣告瞭#_*_coding:utf-8*_,就可以寫中文了, 不宣告的話,python在處理這段程式碼時按ascii,顯然會出錯, 加了這個宣告後,裡面的程式碼就全是utf-8格式了
在有#_*_coding:utf-8*_的情況下,你在宣告變數如果寫成name=u"大保健",那這個字元就是unicode格式,不加這個u,那你宣告的字串就是utf-8格式
utf-8 to gbk怎麼轉,utf8先decode成unicode,再encode成gbk
  2:再說python3
py3裡預設檔案編碼就是utf-8,所以可以直接寫中文,也不需要檔案頭宣告編碼了,乾的漂亮
你宣告的變數預設是unicode編碼,不是utf-8, 因為預設即是unicode了(不像在py2裡,你想直接宣告成unicode還得在變數前加個u), 此時你想轉成gbk的話,直接your_str.encode("gbk")即可以
但py3裡,你在your_str.encode("gbk")時,感覺好像還加了一個動作,就是就是encode的資料變成了bytes裡,我擦,這是怎麼個情況,因為在py3裡,str and bytes做了明確的區分,你可以理解為bytes就是2進位制流,你會說,我看到的不是010101這樣的2進位制呀, 那是因為python為了讓你能對資料進行操作而在記憶體級別又幫你做了一層封裝,否則讓你直接看到一堆2進位制,你能看出哪個字元對應哪段2進位制麼?什麼?自己換算,得了吧,你連超過2位數的數字加減運算都費勁,還還是省省心吧。  
那你說,在py2裡好像也有bytes呀,是的,不過py2裡的bytes只是對str做了個別名(python2裡的str就是bytes, py3裡的str是unicode),沒有像py3一樣給你顯示的多出來一層封裝,但其實其內部還是封裝了的。 這麼講吧, 無論是2還是三, 從硬碟到記憶體,資料格式都是 010101二進位制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes型別-->按照指定編碼轉成你能看懂的文字
編碼應用比較多的場景應該是爬蟲了,網際網路上很多網站用的編碼格式很雜,雖然整體趨向都變成utf-8,但現在還是很雜,所以爬網頁時就需要你進行各種編碼的轉換,不過生活正在變美好,期待一個不需要轉碼的世界。
最後,編碼is a piece of fucking shit, noboby likes it.

相關文章