Python關於編碼的一些總結

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保存到文件:

rw-file-utf-8

2、瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器:

web-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編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章