計算機采用 8 bit(比特,計算機最小表示單位) = 1 byte(字節,計算機最小存儲單位),一個字節能表示的最大的整數就是 255(二進制11111111 = 十進制255),如果要表示更大的整數,就必須用更多的字節,比如兩個字節可以表示的最大整數是 65535 。
ASCII (8位)編碼包括大小寫英文字母、數字和特殊字符,總共256(255+數字0,一共256)個。
中文編碼格式的發展歷程是在 ASCII 的基礎之上經歷了 GB2312(7K+)、GBK1.0(2W+)和 GB18030(27W+)。
Unicode (16位)把所有語言都統一到一套編碼里,解決了亂碼的問題,但造成了存儲空間和網絡傳輸的浪費,因此 Unicode 轉化成了可變長編碼的 UTF-8 編碼。Python3 源碼文件默認使用 UTF-8 編碼,可以正常解析中文,無需指定 UTF-8 編碼。
ASCII編碼 | GBK編碼 | Unicode編碼 | UTF-8編碼 | |
---|---|---|---|---|
英文 | 1btye | 1btye | 2byte | 1byte |
中文 | N/A | 2byte | 2byte | 3byte |
Python2 中默認的編碼格式是 ASCII,因此需要指定字符編碼才能支持中文。字符串默認也是 ASCII ,如果代碼文件頭聲明了其它編碼格式(如 GBK),那字符串就使用聲明的編碼格式,在內存中不會自動轉成 Unicode。
Python3 中默認的編碼格式是 UTF-8。字符串的編碼格式是 Unicode,即使代碼文件頭聲明了其它編碼格式,在內存中也會轉換為 Unicode。
Windows 系統中文版默認編碼是 GBK,Linux 系統默認編碼是 UTF-8。
# Python2指明編碼格式:
# -*- coding:utf-8 -*-
計算機系統通用的字符編碼工作方式:
在計算機內存中,統一使用 Unicode 編碼,當需要保存到硬盤或者需要網絡傳輸的時候,就轉換為 UTF-8 編碼。無論以什么編碼在內存中顯示字符,最終保存到硬盤上都是二進制(不同編碼轉成的二進制不同)。存儲和讀取的編碼必須都要保持一致。
ASCII 轉二進制的過程
把字符串拆分成單個字符,對照 ASCII 表把單個字符轉成十進制,再把十進制轉成二進制,每個字符最終轉換成二進制后都是由 8 位的規則來組成的,不足 8 位的在二進制的左邊補零從而成 8 位。
ASCII轉二進制 | ||
ASCII碼 | 十進制 | 二進制 |
Python | 80 121 116 104 111 110 | 01010000 01111001 01110100 01101000 01101111 01101110 |
可以使用 ord() 和 bin() 函數進行驗證
# 字符對應的十進制整數
>>> ord('P')
80
>>> ord('y')
121
>>> ord('t')
116
>>> ord('h')
104
>>> ord('o')
111
>>> ord('n')
110
#十進制整數對應的二進制
>>> bin(80)
'0b1010000'
>>> bin(121)
'0b1111001'
>>> bin(116)
'0b1110100'
>>> bin(104)
'0b1101000'
>>> bin(111)
'0b1101111'
>>> bin(110)
'0b1101110'