1. 程式人生 > >python與編碼

python與編碼

brush 但是 sci 兩個 為我 編碼 全世界 編碼方式 decode

編碼的概念

編碼就是將信息從一種格式轉換為另一種格式。也就是說,將我們所認識的內容轉換為計算機所認識的二進制格式就是一種編碼的行為,而計算機將二進制格式的內容解碼成我們所認識的內容。

最早的時候計算機使用的編碼規則是ASCII碼,ASCII碼最早是美國人使用的。ASCII碼用一個字節的二進制組來表示一個字符(因為他們只用到26個引文字母和一些符號,最初的ASCII碼甚至只用到7個bit位)。

隨著計算機的日益普及,ASCII碼難以滿足世界各地人們的使用,在中國就出現了GB2312與GBK的編碼方式,使用兩個字節的二進制組表示一個字符(甚至強硬的占用了拉美等國家的最高bit位)。正因為如此,世界各地都使用自己的編碼方式,各自的軟件都無法兼容了,所以就出現了萬國碼。

萬國碼(Unicode)覆蓋了全世界所有的文字,這也太強大了,那我們使用萬國碼不是很方便嗎?但是對於美國人來說,他們只需要使用一個字節就可以表示所有的字符,而現在卻平白無故多出一個字節,這使得內存與硬盤浪費了空間,所以Unicode優化成了現在的utf-8格式。utf-8是可變長的編碼方式,所以現在開發傾向於使用這種編碼方式。但是現在依然很多地方在使用GBK,ASCII等編碼方式,所以對於編碼我們需要詳細的了解。

python2的編碼

python2中默認編碼方式是ASCII碼。

name = 傑夫     #str類型為bytes
name2 = u傑夫   #將字符串類型改為Unicode
print repr(name) print repr(name2) 運行結果 \xbd\xdc\xb7\xf2 u\u6770\u592b

在python2中str字符串類型在內存中存的是bytes類型,Unicode類型字符串存儲的是Unicode數據。

name = 傑夫                #name為字節數據類型
name2 = u傑夫            #name為unicode數據類型
name3 = name.decode(utf8)
name4 = name2.encode(utf8)
print type(name3)
print type(name4) print repr(name) print repr(name2) print repr(name3) print repr(name4) 運行結果 <type unicode> <type str> \xe6\x9d\xb0\xe5\xa4\xab‘ #str字符串類型的bytes數據 u\u6770\u592b‘ #Unicode字符串類型的Unicode數據 u\u6770\u592b‘ #str字符串類型解碼成Unicode數據 \xe6\x9d\xb0\xe5\xa4\xab‘ #Unicode字符串類型編碼成bytes數據

python3的編碼

python3中默認的編碼方式是utf-8.

name = bjeff
name2 = 傑夫
print(type(name))
print(repr(name))
print(type(name2))
print(repr(name2))
運行結果
<class bytes>
bjeff
<class str>
傑夫

python3中str字符串類型在內存中存的是Unicode數據,bytes類型字符串存儲的是bytes數據。

name = bjeff
name2 = 傑夫
name3=name.decode(utf8)
name4=name2.encode(utf8)
print(type(name))
print(type(name2))
print(type(name3))
print(type(name4))
print(repr(name))
print(repr(name2))
print(repr(name3))
print(repr(name4))
運行結果
<class bytes>
<class str>
<class str>
<class bytes>
bjeff‘                         #bytes類型字符串存儲的bytes數據
傑夫‘                           #str類型字符串存儲的Unicode數據
jeff‘ #bytes類型字符串解碼成Unicode數據 b\xe6\x9d\xb0\xe5\xa4\xab‘ #str類型字符串編碼城bytes數據

簡單的總結一下編碼bytes數據是為了方便傳輸與存儲,而Unicode數據方便了顯示,python3比python2更加清晰化了字節與字符的界限,python3取消了python2中的不同類型字符串的拼接。

因為編碼方式的不同經常會出現下面這種情況。

在python中寫一個小程序,

#coding=utf8
print(‘傑夫‘)

  在windows終端打開此文件。

技術分享

這裏顯示出一堆亂碼,這是為什麽呢?

因為我的python3默認編碼方式是utf-8,而我的windows終端默認解碼方式是GBK,lianxi1.py這個文件內容在內存中以utf-8的編碼方式寫入硬盤,在cmd中執行時,cmd軟件默認解碼方式是GBK,用GBK的方式去解碼utf-8的二進制數據,解碼出來的就是一堆亂碼,所以解決方法就是要麽讓cmd使用utf-8的方式來解碼,否則就只能讓python解釋器用GBK方式將文件內容編碼存入硬盤。

#coding=GBK
print(傑夫)

技術分享

python與編碼