Python關於編碼的一些總結
(關於學習廖雪峯Python教程的一些個人總結)
首先你一定聽過Unicode,UTF-8,ASCII編碼。
在編碼使用的字節長度上:
ASCII:美國人發明,最早只有127個字符(包括大小寫英文,數字,符號)被編碼到計算機裏,只用一個字節表示。
Unicode:但是每個國家都有自己的語言,一個字節肯定不夠,就得需要兩個或者更多字節表示,每個國家都制定了自己的編碼標準,比如中國的GB2312編碼,但是這樣容易衝突導致亂碼。所以Unicode標準產生,統一所有語言,通常用兩個字節表示一個字符(生僻字可能用到四個字節),這樣像ASSCII這樣只需一個字節編碼的符號,只需在前面補零。比如’A’的ASCII二進制是01000001,Unicode就是00000000 01000001。
UTF-8:但是在傳輸和存儲上,如果含有大量ASCII裏面的字符,使用Unicode編碼就會導致傳輸效率低下,浪費存儲空間,本着節約的原則,就有了可變長編碼UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。
下面表格表示了同一個字符不同編碼的區別(二進制表示):
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分。
在計算機系統中編碼工作方式上:
在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換爲UTF-8編碼。
比如有兩個例子:
1、用記事本編輯的時候,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件:
2、瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器:
關於編碼和解碼
通俗來講,編碼就是把字符串或數據編碼成人看不懂的東西(以字節爲單位的bytes),但是對計算機來說很爽,比如存儲和傳輸很方便,解碼就是把編碼後的字符串再解碼回人能看懂的字符串。
Python3的字符串類型是str
,內存中以Unicode編碼,
你可能見過下面這些東西
b'\xe4\xb8\xad\xe6\x96\x87'
b'\u4e2d\u6587'
第一行\x開頭的一串就是’中文’這個字符串用UTF-8編碼後的形式(bytes對象),第二行\u開頭的是’中文’這個字符串的Unicode編碼形式,所以編碼encode就是把人看懂的字符串編碼成人看不懂但是計算機能看懂的東西。
解碼就是把bytes解碼成人能看懂的
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
b'\u4e2d\u6587'.decode('unicode_escape')
## '中文'
關於字符串前面的字母
你可能見過下面這些東西
b'\xe4\xb8\xad\xe6\x96\x87'
u'中文'
r'\n\n\n\n'
第一行b'\xe4\xb8\xad\xe6\x96\x87'
上面我們見到了,它表示這是一個bytes對象,也就是編碼後的結果,而不是str
,不是str
,不是str
,不是字符串,它具有decode方法,可以解碼成字符串,也就是可以這樣寫:
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
但是你這樣寫就不行
'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
因爲這樣寫表示這是個字符串,解釋器會報錯告訴你str
類型沒有decode方法。
第二行u'中文'
表示字符串以Unicode格式進行編碼,一般用在中文字符串前面。
第三行r'\n\n\n\n'
表示去轉義,即r後面跟着的字符串中有啥打印啥,不會出現轉義字符
print(r'\n\n\n\n')
結果會是’\n\n\n\n’,而不是四個換行符。
關於Python文件(.py
文件)開頭的註釋
你可能見到過別人的項目Python文件開頭有這樣的註釋
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行註釋是爲了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;
第二行註釋是爲了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。