字串編碼在python裡是經常會遇到的問題,特別是寫檔案或是網路傳輸呼叫某些函式的時候.
現在來看看python中的unicode編碼和utf-8編碼
字串編碼的歷史
計算機只能處理數字,文字轉換為數字才能處理. 計算機中8個bit作為乙個位元組,所以乙個位元組能表示最大的數字為255
計算機是美國人發明的,乙個位元組就可以表示所有的英文本元了,所以acsii(乙個位元組)編碼就成為美國人的標準編碼
但是中文裡遠遠不止255個漢字,這時用ascii來處理中文是明顯不夠用的,所以我國制定了gb2312編碼,用兩個位元組表示乙個漢字.
gb2312還把ascii包含進去.同理,別的國家為了解決自己國家的編碼問題也都發展了一套位元組的編碼,這樣標準就越來越多.
如果一篇文章出現多種語言混合顯示就一定會出現亂碼.
這裡unicode出現了,unicode把所有的語言統一到一套編碼裡.
看一下ascii編碼和unicode編碼:
字母a用ascii編碼十進位制是65,二進位制是0100 00001
漢字"中"已經超出了ascii編碼的範圍,用unicode編碼是20013,二進位制是0100 1110 0010 1101
a用unicode編碼只需要前面補0,二進位制是00000000 0100 0001
亂碼問題解決了,但是如果一段內容全是英文,unicode編碼比ascii需要多一倍的儲存空間,浪費很多硬碟容量.同時傳輸時也需要多浪費很多頻寬.
"utf-8"會把英文變成乙個位元組,漢字3個位元組.特別生僻的變成4到6個位元組.如果傳輸的英文,就把英文輪換成unicode編碼格式.
python儲存檔案和讀取檔案時編碼的關係
儲存檔案時,把unicode編碼轉換成utf-8編碼格式
讀取檔案時,把utf-8編碼轉換成unicode編碼格式
分別在windows系統和linux系統中測試python2和python3的編碼區別
在windows系統的python2版本
中
python 2.7.13 (v2.7.13:a06454b1afa1, dec 17 2016, 20:53:40) [msc v.1500 64 bit (amd64)] on win32
>>> str1="hello" # 因為str1和str2都是英文,所以atr1和str2不管是unicode編碼還是ascii格式
>>> str2=u"hello" # encode成utf-8編碼時都不會出現錯誤
>>> str1.encode("utf-8")
'hello'
>>> str2.encode("utf-8")
'hello'
>>> type(str1)
>>> type(str2)
>>> str3="我用python" # python中的字串在記憶體中是用unicode來編碼的
>>> str4=u"我用python" # str3在windows系統中儲存成gbk編碼
>>> str3.encode("utf-8") # str3在呼叫encode方法之前必須轉換為unicode編碼
traceback (most recent call last): # 此時str3應該先decode成為unicode編碼,然後再encode成utf-8編碼
file "", line 1, in unicodedecodeerror: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
>>> str3.decode("utf-8")
traceback (most recent call last):
file "", line 1, in file "d:\python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, true)
unicodedecodeerror: 'utf8' codec can't decode byte 0xce in position 0: invalid c
ontinuation byte
>>> str3.decode('gbk')
u'\u6211\u7528python'
>>> str3.decode("utf-8").encode("utf-8")
'\xe6\x88\x91\xe7\x94\xa8python'
>>> str4.encode("utf-8")
'\xe6\x88\x91\xe7\x94\xa8python'
>>> type(str3)
>>> type(str4)
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
在windows系統的python3版本
中
python 3.6.1 (v3.6.1:69c0db5, mar 21 2017, 18:41:36) [msc v.1900 64 bit (amd64)] on win32
>>> str1="hello" # python3中所有的字串都是unicode編碼
>>> str2=u"hello"
>>> str1.encode("utf-8")
b'hello'
>>> str2.encode("utf-8")
b'hello'
>>> str3="我用python"
>>> str3.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python'
>>> str4=u"我用python"
>>> str4.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python'
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
在linux系統的python2版本
中
python 2.7.5 (default, nov 6 2016, 00:28:07)
[gcc 4.8.5 20150623 (red hat 4.8.5-11)] on linux2
>>> str1="我用python"
>>> str1.encode("utf-8")
traceback (most recent call last):
file "", line 1, in unicodedecodeerror: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
>>> str1.decode("gbk")
u'\u93b4\u6220\u6564python'
>>> str1.decode('utf-8') # linux系統中python2會把字串儲存成utf-8編碼,那為什麼不能直接encode呢?
u'\u6211\u7528python' # 字串在encode之前應該保證是乙個unicode編碼格式,字串在encode之前
# 會呼叫decode方法把字串轉換成unicode編碼,然後才能encode
>>> str1.decode("utf-8").encode("utf-8") # str1字串中含有中文,直接encode成utf-8編碼會出現錯誤
'\xe6\x88\x91\xe7\x94\xa8python'
>>> str1.decode("gbk").encode("utf-8")
'\xe9\x8e\xb4\xe6\x88\xa0\xe6\x95\xa4python'
>>> str2=u"我用python"
>>> str2.encode("utf-8")
'\xe6\x88\x91\xe7\x94\xa8python'
>>> type(str1)
>>> type(str2)
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
在linux系統的python3版本
中
python 3.6.3 (default, nov 7 2017, 20:33:25)
[gcc 4.8.5 20150623 (red hat 4.8.5-11)] on linux
>>> str1="我用python" # python3中所有的字串都是unicode編碼
>>> str2=u"我用python"
>>> str1.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python'
>>> str2.encode("utf-8")
b'\xe6\x88\x91\xe7\x94\xa8python'
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
不管是windows系統還是linux系統,python2版本中預設使用ascii編碼
,python3版本預設使用utf-8編碼
關於字元編碼的那些事
作為程式設計師,在工作或者學習的過程中肯定遇到字元亂碼的現象。可能是在某個檔案的文字內容 現,又或者是在網路傳輸的過程中遇見。而發生這些問題的原因都和今天要說主角字元編碼有關係。由於計算機本身不能表述具體的資訊,因此通過規定好的數字對現實生活中的資訊比如英文 中文進行描述,通過這種方式就可以表述具體...
聊聊字元編碼那些事
計算機字元編碼的歷史 在windows作業系統下可以通過命令列模式檢視系統使用的字符集,如下圖所示 從圖中看到,活動頁 為936,代表gb2312 簡體中文 作者的個人計算機安裝的是windows10簡體中文版。microsoft visual studio整合開發環境採用的字元編碼是作業系統使用的...
Python的那些事
python是什麼?python能做什麼?怎麼配置python的開發環境?誰能學習python?怎麼學習python?定義 python是一種跨平台的計算機程式語言,是解釋型,強型別定義和動態的高階程式語言。或許你對其中的名詞存在疑惑,但是沒關係,我現在給你解釋一下他們的含義。vim install...