首先來說,編碼即是密碼本,編碼記錄的就是二進制與文字之間的對應關系,現存的編碼本有:
ASCII碼:包含英文字母,數字,特殊字符與01010101對應關系:共127個字符,使用7位二
進制表示,擴展一位,共256個字符
a 01000001 一個字符一個字節表示。即八位二進制數
GBK: 只包含中國漢字以及英文,數字特殊字符與01010101對應關系:
a 01000001 ASCII碼中的字:一個字符一個字節表示
中 01001001 01000010 中文:一個字符兩個字節表示。
Unicode: 包含全世界所有的文字與二進制01010101的對應關系
a 01000001 01000001 01000001 01000001
中 01001001 01001001 01001001 01001001
UTF-8 包含全世界所有的文字與二進制01010001的對應關系(最少用8位一個字節表示一個字符)。
a 01000001 ASCII中的字符,一個字符一個字節表示
To 01000001 01000010 (歐洲文字:葡萄牙,西班牙等)一個字符兩個字節表示
中 01001001 01000010 01100011 亞洲文字:一個字符三個字節表示
為防止轉換出現亂碼,數據在內存中全部是Unicode編碼的,可以識別幾乎全部的文字。
但是Unicode一個字符需要4個字節,占用空間大,當數據用於網絡傳輸或者存儲到硬盤
中,必須是非Unicode編碼。
# python3X 以 str為例,模擬將一句話通過網絡發給對方
# content就是那句話. 內存中的編碼方式:Unicode。首先轉化為非Unicode再傳輸和存儲
# content = input(">>>")
# print(content)
# bytes , 屬於字符串 表現形式:b"str"
# b = b"hello"
# print(b, type(b)) # b'hello' <class 'bytes'>
# b = b"中國"
# print(b, type(b)) # SyntaxError: bytes can only contain ASCII literal characters.
# str ---> bytes
s1 = "中國"
b1 = s1.encode("utf-8") # encode 編碼
print(b1, type(b1)) # b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>. utf-8 三個字節一個漢字
# bytes --->str
b2 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s2 = b2.decode("utf-8") # decode 解碼
print(s2, type(s2))
# str ---> bytes
s3 = "中國"
b3 = s3.encode("GBK") # encode 編碼
print(b3, type(b3)) # b'\xd6\xd0\xb9\xfa' <class 'bytes'>. 中文GBK兩個字節一個漢字
# bytes --->str
b4 = b'\xd6\xd0\xb9\xfa'
s4 = b4.decode("GBK") # decode 解碼
print(s4, type(s4))