Java基础一 (Unicode 与 Java)

Unicode编码是一个“字符集”编码方案,就是字符的编码(代码值)和字符的对应关系表,如(代码值:0x4E00 对应字符:一)。
代码点(code point)指编码表中的某个字符对应的代码

理解Unicode:

Unicode代码点可以分为17个代码级别(code plane)
第一个代码级别称为:基本多语言级别(basic multilingual plane),代码点从0x0000到0xFFFF;其余的16个附加级别,代码点从0x10000到0x10FFFF。
Unicode编码的一种实现方案Utf-16:

UTF-16编码采用不同长度的编码表示所有的Unicode代码点。在基本的多语言级别中,每个字符用16位(2字节)表示,通常被称为代码单元(code unit),而辅助字符采用一对连续的代码单元进行编码,这样构成的编码值一定落入基本多语言级别中空闲的2048个字节内(即:0XD800 到 0XDFFF ,含起始与结束 ),通常称为替代区域(surrogate area)(U+D800到U+DBFF用于第一个代码单元,U+DC00到U+DFFF用于第二个代码单元)。

UTF-16编码算法:

UTF-16编码以16位无符号整数为单位。我们把Unicode编码记作U。编码规则如下:
我们把Unicode编码记作U。编码假设U是一个代码点,也就是Unicode编码表中一个字符所对应的Unicode值。
1)如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
  也就是处于Unicode的基本多语言级别中。这样16bits(一个代码单元)就足够表示出字符的Unicode值。

2) 如果0x10FFFF>U>=0x10000,也就是处于附加级别中。UTF-16用2个16位来表示,并且正好将每个16位都控制在替代区域U+D800-U+DFFF 中了,具体操作如下:
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。
为什么U'可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示。例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843 0xDC30。

Java语言使用的是Unicode字符集,Utf-16编码方案来实现。

char类型在Java中对于很多初学者都会自然觉得是表示字符的简单类型,没有深层次的思考。然而,char实际存储的是一个utf-16编码的代码单元,并不是一个代码点,因此只有在基本多语言级别的字符才可以用char表示,而在附加多语言级别的字符是无法用char类型去表示的,附加多语言级别字符占用两个代码单元,而char只能存储一个代码单元。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值