1. 程式人生 > >Unicode和UTF-8字串編碼解碼原理

Unicode和UTF-8字串編碼解碼原理

最近工作遇到一個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 的過程。反之亦然。

今天寫到這裡,明天整理一下思路,寫一個簡單的編碼解碼工具。

大家有興趣的話可以自己嘗試將自己喜歡的漢字編碼,並在下方 評論中寫出。