Unicode和UTF-8字串編碼解碼原理
阿新 • • 發佈:2018-12-11
最近工作遇到一個Bug,大概情況是這樣的。一個密碼輸入框中輸入漢字“阿”,輸入內容校驗報錯文言顯示不對,在分析這個bug的時候,我發現了更有意思的知識點,那就是關於unicode和utf-8對字串進行編碼解碼的知識點。
首先需要明白的是unicode和utf-8的關係。
簡單來說:
Unicode是「字符集」,而UTF-8是「編碼規則」。
字符集為每一個「字元」分配一個唯一的ID(學名為碼位/碼點/Code Point),而「編碼規則」則是將「碼位」轉換為位元組序列的規則。
廣義的Unicode是一個標準,定義了一個字符集以及一系列的編碼規則,即Unicode字符集和UTF-8、UTF-16、UTF-32等等。
Unicode字符集為每一個字元分配一個碼位,例如「田」的碼位是30000,記作U+7530(30000的16進製為0x7530)。
UTF-8顧明思義,是一套以8位為一個編碼單位的可變長編碼。會將一個碼位編碼為1到4個位元組:
U+ 0000 ~ U+ 007F: 0XXXXXXX U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX 根據上表中的編碼規則,之前的「田」字的碼位 U+7530 屬於第三行的範圍: 7 5 3 0 0111 0101 0011 0000 二進位制的 7530 -------------------------- 0111 011111 100101 二進位制的 77E5 1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行) 11100111 10010100 10110000 代入模版 E 7 9 4 B 0 這就是將 U+7530 按照 UTF-8 編碼為位元組序列 E794B0 的過程。反之亦然。
今天寫到這裡,明天整理一下思路,寫一個簡單的編碼解碼工具。
大家有興趣的話可以自己嘗試將自己喜歡的漢字編碼,並在下方 評論中寫出。