为了不忘记以前看过的unicode规范。决定写此文章,以便于记忆。
UCS 4
byte1 首位为0, 2^7=128个group
byte2 2^8=256个plane
byte3 256 row
byte4 256 cell
group 0 plane0 为Basic Multilingual Plane (BMP).
BMP去掉前面的两个字节 就等同于 UCS 2.
Now Unicode 使用了17个plane, 一个 17*2^16个codepoint.
平面15 0xF0000 - 0xFFFFD
平面16 0x100000 - 0x10FFFD
这两个平面定义了大约2^17个码位,作为Private Use Area. PUA给大家自定义。
java里面的string是适用UTF16来表示的。
这里可以看出,BMP里面的字符码点小于2^16,完全可以使用两个字节表示。
BMP以外的字符如何来表示?BMP以外的字符的码点大于2^16,只能使用2个UTF16单位。
怎么区分BMP和BMP以外的字符?在BMP中,保留了0xE000 - 0xF8FF 0xD800-0xDFFF作为代理区。
使用代理区+一个UTF16单元,表示一个BMP以外的字符。
UTF8,16,32都是一种编码转换格式。
在java中,String使用UTF16编码格式。使用codepointAt(offset)来得到offset字符处的unicode码,
如果codepoint大于2^16,说明此处字符需要使用2个UTF16单元。
String str = "XXXXXX";
int i = 0;
while (i < str.length()) {
// 此处字符的unicode码点
int codepoint = str.codepointAt(i);
if (codepoint >= 0x100000000) {
// 此字符占用2个UTF16单元。跳过一个字符。
i++;
}
i++
}