本文简介:是关于JAVA中char数据类型的编码方式_主要涉及Unicode,UTF-16.
关键字:JAVA,char,Unicode,UTF-16.
Unicode代码单元:可用十六进制格式的编码单元,从\u0000~\uFFFF 表示。
Unicode转义序列——表示特殊字符 =>可以出现在“字符常量”“字符串”的引号内。转义序列符\u还可以出现在字符常量或字符串的引号之外。
要想弄清楚char,就必须弄清楚Unicode编码表。
设计JAVA的时候用的是Unicode编码方式,用两个字节的代码宽度=>编码=>世界上所以语言的字符。
十分遗憾的是,现在不可避免的事情发生了,Unicode字符超过了65536个,对此16位的char类型已经不能满足表示所以Unicode字符的需要了。
那么JAVA是如何解决这类问题的呢?
先引入一些小概念。
代码点(code point):是指“编码表”中的某个字符对应的“编码”Unicode标准中,代码点用十六进制书写,并加前缀U+,例如U+0041表示字母A的代码点。
Unicode的代码点可分为17个代码级别(code plane)。第一个代码级别 =>基本的多语言级别-basic multilingual plane,代码点从U+0000~U+FFFF(其中包括一些经典的Unicode代码),其余的十六个附加的级别,代码点从U+1 0000 ~ U+10 FFFF (其中包括一些辅助字符)
在JAVA中,char类型用UTF-16编码描述一个代码单元(字符)。是Unicode的一个使用方式。
UTF-16编码采用不同长度的编码表示所以Unicode代码点。
用16个位表示=>Unicode中“基本的多语言基本”——代码单元。(在基本的多语言基本中,从U+D800 ~ U+DFFF之间的区段是没有使用的。因此可以用这一区段的值累对辅助字符进行编码)
其他级别中,辅助字符采用一对连续的代码单元进行编码(16*2)。这样构成的编码值一定落入基本的多语言基本中空闲的2048字节内,称替代区域。【U+D800~U+DBFF用于第一个单元,U+DC00~U+DFFF用于第二个代码单元】——通过这样巧妙的设计,我们可以非常清楚地知道,这个代码单元是表示一个“字符”,还是属于"辅助字符"中的第一部分/第二部分
UTF-16的编码方法:
1、如果字符编码U小于0x10000,也就是十进制的0到65535之内,则直接使用两字节表示;
2、如果字符编码U大于0x10000,由于UNICODE编码范围最大为0x10FFFF,从0x10000到0x10FFFF之间 共有0xFFFFF个编码,也就是需要20个bit就可以标示这些编码。用U'表示从0-0xFFFFF之间的值,将其前 10 bit作为高位和16 bit的数值0xD800进行 逻辑or 操作,将后10 bit作为低位和0xDC00做 逻辑or 操作,这样组成的 4个byte就构成了U的编码。
范例: UTF-16 编码程序
假设要将 U+64321 (16进位) 转成 UTF-16 编码. 因为它超过 U+FFFF, 所以他必须编译成32位元(4个byte)的格式,如下所示:
转载于:https://blog.51cto.com/mazego/611488