python編碼問題
- 2020 年 1 月 8 日
- 筆記
基本常識 ASCII編碼是1個位元組bytes,而Unicode編碼通常是2個位元組 1bytes=8bit 在電腦記憶體中,統一使用Unicode編碼,當需要保存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼。
字母"A"用ASCII編碼是十進位的65,二進位的01000001; 字元"0"用ASCII編碼是十進位的48,二進位的00110000,注意字元'0'和整數0是不同的; 漢字"中"已經超出了ASCII編碼的範圍,用Unicode編碼是十進位的20013,二進位的01001110 00101101,1個位元組的ASCII編碼已經不能滿足。
可以猜測,如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以,因此,A的Unicode編碼是00000000 01000001, 區別:一個是1位元組一個是2位元組。
試想如果你的文本全是英文,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不划算,因為Unicode是2個位元組,一個位元組可以表示完所有的英文字母單詞。
所以,本著節約的精神,又出現了把Unicode編碼轉化為「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間:
字元 |
ASCII |
Unicode |
UTF-8 |
---|---|---|---|
A |
01000001 |
00000000 01000001 |
01000001 |
中 |
沒有 |
01001110 00101101 |
11100100 10111000 10101101 |
表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支援ASCII編碼的歷史遺留軟體可以在UTF-8編碼下繼續工作。

