码点:码点是指在一个编码表中的某个字符对应的代码值
代码单元:字符集的最小编码单位。
Unicode将所有的码点分为了17个代码平面,其中两个字节的码点都放在了第一个代码平面(基本多语言平面)U+0000 ~ U+FFFF,第一个代码平面的码点并没有全部使用,U+D800 ~ U+DFFF这个范围留有他用,而其他一些辅助字符放在了其他16个代码平面,U+10000 ~ U+1FFFF、U+20000 ~ U+2FFFF…U+F0000 ~ U+FFFFF。
UTF-16编码第一个代码平面时用一个代码单元,而编码2 ~ 17代码平面的码点时会通过一定的算法将其拆成两个代码单元,第一个代码单元在U+D800 ~ U+DBFF范围内,第二个代码单元在U+DC00~U+DFFF范围内,这样我们就可以知道某个代码单元是一个完整的码点还是一个码点的第一个代码单元或第二个代码单元。
所以码点在第一个代码平面时,UTF-16用两个字节表示;码点在其他代码平面时UTF-16用4个字节表示。这种采用不同长度的编码方式的称为变长编码方式。在Java中char类型描述了UTF-16编码中的一个代码单元,或者说char类型就是一个UTF-16编码表示Unicode码点的代码单元。一个char类型并不能装下Unicode的所有码点。