众所周知,java中的char采用的是unicode编码(某一字符的该编码是固定不变的),其实现方式有utf-8、utf-16和utf-32。
在Unicode字符集中的某个字符对应的代码值(unicode编码),称作代码点(Code Point),用16进制书写,并加上U+前缀。
unicode编码取值范围:0-0x10FFFF(共21bit)
U+0000~U+FFFF(Basic Multilingual Plane,BMP)
U+10000~U+10FFFF(Supplementary Plane)
utf-8:
使用1-4个字节存储unicode编码,规则有二条:
1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2.对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的二进制位,组合成为该字符的unicode编码。
如下:
[1个字节]0xxxxxxx
[2个字节]110xxxxx 10xxxxxx
[3个字节]1110xxxx 10xxxxxx 10xxxxxx
[4个字节]11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
utf-16:
使用16bits或32bits存储unicode编码
U+D800到U+DFFF之间的Code Point区段是永久保留不映射到字符
1.对U+0000~U+D7FF以及U+E000~U+FFFF的编码
数值等价于对应的Code Point
2.对U+10000~U+10FFFF的编码
2.1Code Point减去0x10000, 得到的值是长度为20bit(0~0xFFFFF);
2.2步骤2.1得到数值的高位的10比特的值(值范围为0~0x3FF)加上0xD800得到第一个Code Unit或称作高位代理(high surrogate)或前导代理(lead surrogate)。取值范围是0xD800~0xDBFF。
2.3步骤2.1得到数值的低位的10比特的值(值范围为0~0x3FF)加上0xDC00得到第二个Code Unit或称作低位代理(low surrogate)或后尾代理(trail surrogate)。取值范围是0xDC00~0xDFFF。
这样,这个范围内的字符就被编码成了一个代理对[lead surrogate,trail surrogate]:两个16bits的Code Unit,取值范围分别是0xD800~0xDBFF和0xDC00~0xDFFF。而BMP中得到的Code Unit的范围是0x0000~0xFFFF(0xD800~0xDFFF是保留的,不包含其中),所以这三个区段是相互不重叠的,在解码时很容易实现。
utf-32:
在Unicode字符集中的某个字符对应的代码值(unicode编码),称作代码点(Code Point),用16进制书写,并加上U+前缀。
unicode编码取值范围:0-0x10FFFF(共21bit)
U+0000~U+FFFF(Basic Multilingual Plane,BMP)
U+10000~U+10FFFF(Supplementary Plane)
utf-8:
使用1-4个字节存储unicode编码,规则有二条:
1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2.对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的二进制位,组合成为该字符的unicode编码。
如下:
[1个字节]0xxxxxxx
[2个字节]110xxxxx 10xxxxxx
[3个字节]1110xxxx 10xxxxxx 10xxxxxx
[4个字节]11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
utf-16:
使用16bits或32bits存储unicode编码
U+D800到U+DFFF之间的Code Point区段是永久保留不映射到字符
1.对U+0000~U+D7FF以及U+E000~U+FFFF的编码
数值等价于对应的Code Point
2.对U+10000~U+10FFFF的编码
2.1Code Point减去0x10000, 得到的值是长度为20bit(0~0xFFFFF);
2.2步骤2.1得到数值的高位的10比特的值(值范围为0~0x3FF)加上0xD800得到第一个Code Unit或称作高位代理(high surrogate)或前导代理(lead surrogate)。取值范围是0xD800~0xDBFF。
2.3步骤2.1得到数值的低位的10比特的值(值范围为0~0x3FF)加上0xDC00得到第二个Code Unit或称作低位代理(low surrogate)或后尾代理(trail surrogate)。取值范围是0xDC00~0xDFFF。
这样,这个范围内的字符就被编码成了一个代理对[lead surrogate,trail surrogate]:两个16bits的Code Unit,取值范围分别是0xD800~0xDBFF和0xDC00~0xDFFF。而BMP中得到的Code Unit的范围是0x0000~0xFFFF(0xD800~0xDFFF是保留的,不包含其中),所以这三个区段是相互不重叠的,在解码时很容易实现。
utf-32:
直接使用32bits存储unicode编码
参考文档:
http://blog.youkuaiyun.com/thl789/article/details/7506133