文章目錄
- 1. 字符、碼位和字節表述
- 4.1字符問題
- 2. bytes、bytearray 和 memoryview 等二進制序列的獨特特性
- 3. 全部 Unicode 和陳舊字符集的編解碼器
- 4.避免和處理編碼錯誤
- 5.處理文本文件的最佳實踐
- 6.默認編碼的陷阱和標準 I/O 的問題
- 7.規范化 Unicode 文本,進行安全的比較
- 8.規范化、大小寫折疊和暴力移除音調符號的實用函數
- 9.使用 locale 模塊和 PyUCA 庫正確地排序 Unicode 文本
- 10.Unicode 數據庫中的字符元數據
- 11.能處理字符串和字節序列的雙模式 API
1. 字符、碼位和字節表述
4.1字符問題
“字符串”是個相當簡單的概念:一個字符串是一個字符序列。問題出在“字符”的定義上。
在 2015 年,“字符”的最佳定義是 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。
把碼位轉換成字節序列的過程是編碼;把字節序列轉換成碼位的過程是解碼。
- 如果想幫助自己記住 .decode() 和 .encode() 的區別,可以把字節序列想成
晦澀難懂的機器磁芯轉儲,把 Unicode 字符串想成“人類可讀”的文本。那么,把字節
序列變成人類可讀的文本字符串就是解碼,而把字符串變成用于存儲或傳輸的字節
序列就是編碼。