非基础平台的Unicode码点的进制数表达
从java的String类的码点获取中得知,U+10000 ~ U+10FFFF的字符并非直接存储值至char数组,而是会经过一定的转化。以下是思路(自己参考总结得出,并不一定契合原本意图)。
highSurrogate code unit:‘\uD800’ ~ ‘\uDBFF’;lowSurrogate code unit:‘\uDC00’ ~ ‘\uDFFF’。high-BIN_low-BIN通过以下格式转换成码点:
非基础平台的Unicode进制数转码点
= (hight-BIN - MIN_HIGH_SURROGATE) << 10 + (low-BIN - MIN_LOW_SURROGATE) + MIN_SUPPLEMENTARY_CODE_POINT
= (hight-BIN - 0xD800)<< 10 + (low-BIN - 0xDC00’) + 0x1_0000
= (hight-BIN & 0x3FF) << 10 | (low-BIN - 0x3FF) + 0x1_0000
= 截取hight-BIN的低10bit | 截取low-BIN的低10bit + 0x1_0000
‘\uD800’ ~ ‘\uDBFF’:1101_10|00_0000_0000 - 1101_10|11_1111_1111
‘\uDC00’ ~ ‘\uDFFF’:1101_11|00_0000_0000 - 1101_11|11_1111_1111
MIN_SUPPLEMENTARY_CODE_POINT的作用:Unicode字符的占bit至少需要21,因此用0x1_0000将其规范至20-bit group内。这里再将20-bit拆分两组10bit group,分别添加到\uD800和\uDC00的低位。但问题来了,第一平台的Unicode的占16bit,如何区分这两类所占char的不同,难道只是默认高位\uD800、\uDC00的情况表示非第一平台的Unicode字符?