本人以前就經常搞不清楚utf-8、unicode、字符串、二進制序列、編碼、解碼這幾個之間的關系,趁今天有時間,趕緊寫篇文章鞏固這幾個概念,免得以后又搞混了。
字符串是什么?
字符串就是字符序列,說得更通俗點,一串字符就是字符串。問題在於該如何給字符下定義?
2015年開始,“字符”的最好定義就是Unicode字符。python3的str對象里獲取的元素就是unicode字符。
Unicode標准把字符的標識和具體的字節表述進行了明確的區分。
* 字符的標識,即碼位,是 0~1 114 111 的數字(十進制),在 Unicode 標准中以 4~6 個
十六進制數字表示,而且加前綴“U+”。例如,字母 A 的碼位是 U+0041,歐元符號的
碼位是 U+20AC,高音譜號的碼位是 U+1D11E。在 Unicode 6.3 中(這是 Python 3.4 使
用的標准),約 10% 的有效碼位有對應的字符。
* 字符的具體表述取決於所用的編碼。編碼是在碼位和字節序列之間轉換時使用的算法。
在 UTF-8 編碼中,A(U+0041)的碼位編碼成單個字節 \x41,而在 UTF-16LE 編碼中
編碼成兩個字節 \x41\x00。再舉個例子,歐元符號(U+20AC)在 UTF-8 編碼中是三個
字節——\xe2\x82\xac,而在 UTF-16LE 中編碼成兩個字節:\xac\x20
把碼位(Unicode字符)轉換成具體字節的過程叫編碼encode;把字節轉換成碼位(Unicode)的過程叫解碼decode。
1 s = "中國人" 2 print(type(s)) 3 #對Unicode字符串編碼 4 bs = s.encode("utf-8") 5 #解碼 6 print(bs.decode())
為了方便自己記憶,可以把字節序列想象成機器可以理解的二進制,Unicode字符串當成人類可以讀的文本字串,那么吧二進制轉換成人類可讀的文本就是解碼,把人類可讀的文本轉換成二進制進行存儲或者網絡傳輸的過程就是編碼。