上一篇講完了utf8編碼,這篇接着講UTF-16,UTF-16和UTF-8一樣也是變長編碼,不同的是,UTF-16是2位元組或4位元組。基本平面(BMP)的2^16個字元的Unicode編碼直接作為UTF-16編碼,是以單位元組的ASCII在Unicode中也是兩位元組編碼。其他16個輔助平面的字元使用4位元組編碼。問題來了,如何區分一串6位元組的UTF-16編碼是一個兩位元組的字元加一個四位元組的字元,還是3個2位元組的字元了?
UTF-16有一個很巧妙的設計規則,在基本平面内,從U+D800到U+DFFF是一個空段,即這些碼點不對應任何字元。是以,這個空段可以用來映射輔助平面的字元。具體來說,輔助平面的字元位共有2^20個,也就是說,對應這些字元至少需要20個二進制位。UTF-16将這20位拆成兩半,前10位映射在U+D800到U+DBFF(空間大小2^10),稱為高位(H),後10位映射在U+DC00到U+DFFF(空間大小2^10),稱為低位(L)。這意味着,一個輔助平面的字元,被拆成兩個基本平面的字元表示。
是以,當我們遇到兩個位元組,發現它的碼點在U+D800到U+DBFF之間,就可以斷定,緊跟在後面的兩個位元組的碼點,應該在U+DC00到U+DFFF之間,這四個位元組必須放在一起解讀。
如果是輔助平面字元,Unicode 3.0版給出了轉碼公式。
如果一個Uncode碼為c的字元是輔助平面字元那麼它的UTF-16轉化公式為
H = floor((c-0x10000) / 0x400)+0xD800
L = (c - 0x10000) % 0x400 + 0xDC00
比如下圖的八分音符, Unicode碼為U+1D160,它的UTF-16碼為:
高位 floor((0x1D160-0x10000) / 0x400)+0xD800 = 0xD834
低位 (0x1D160 - 0x10000) % 0x400 + 0xDC00 = 0xDD60
0xD834 DD60長度為4位元組。我們可以在裡任選一個輔助平面的字元經行校驗計算

我們在某些編輯器裡面還可見到USC-II編碼,這其實可以看成是UTF-16的一個子集,即用兩個位元組的Unicode碼編碼的主平面(BMP)的65536個字元。而輔助平面的字元無法用USC-II編碼表示。