[java]深入理解java中的char,unicode编码及其实现方式

众所周知,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:

直接使用32bits存储unicode编码


参考文档:
http://blog.csdn.net/thl789/article/details/7506133

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值