600 字搞懂字節(jié)、字符、編碼、解碼
字符(Character)就是我們看得到、讀得懂的東西,比如 e?是個(gè)英文字符,一?是個(gè)中文字符。
字節(jié)(Byte)就是 8 比特二進(jìn)制,比如 01100101。 01100101 是二進(jìn)制表示形式,用十六進(jìn)制表示就是 65。 這種表示方法難讀懂多了,卻是計(jì)算機(jī)用來表示數(shù)據(jù)的基本方法。
編碼(Encode),涉及到編碼方法。 將 'e' 用 ASCII 編碼編碼成十六進(jìn)制, 得到 65, 用一個(gè)字節(jié)表示。將 '一' 用 uft8 編碼編碼成十六進(jìn)制,得到 e4 b8 80, 用三個(gè)字節(jié)表示。 編碼是將字符轉(zhuǎn)化為字節(jié)的過程。解碼(Decode)是將字節(jié)轉(zhuǎn)化為字符的過程,其將用十六進(jìn)制表示的數(shù)據(jù)解開成我們讀得懂的字符。
下面以字符 e、é、一 為例,理解字符,字節(jié),編碼,解碼之間的區(qū)別與聯(lián)系。
以下 Python 代碼將字節(jié) 65 e9 解碼為 eé。 解碼方法是 latin-1。 \x 是個(gè)轉(zhuǎn)義符,代表后面的數(shù)字是十六進(jìn)制。將字節(jié) 65 解碼,得到字符 e, 將字節(jié) e9 解碼, 得到字符 é。

以下 Python 代碼將三個(gè)字節(jié) 65 c3 a9 解碼為 eé。 與上例不同,這里的解碼方法是 utf8。 同樣是 é, latin-1 將其編碼成 e9, 占一個(gè)字節(jié),而 utf8 將其編碼成 c3 a9,占兩個(gè)字節(jié)。

以下 Python 代碼將中文字符 一 以 utf8 編碼表示,表示為 e4 b8 80,用了三個(gè)字節(jié)。 可見,使用 utf8 編碼,每個(gè)字符可以是不等長的,編碼 é 用兩個(gè)字節(jié), 而編碼 一 用三個(gè)字節(jié)。 問題:使用?utf8?編碼,編碼 e 會(huì)用幾個(gè)字節(jié)?
