【Java】什么是Unicode和UTF

Unicode(字符集)

广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……

Unicode产生原因

在Unicode出现之前,各国拥有自己的不同编码标准,如美国的ASCII西欧的ISO8859-1,俄罗斯的koi-8,中国的GB18030和BIG-5
对于任意给定的代码,在不同的编码方案下,有可能对应不同的字母
采用大字符集的语言,其编码长度有可能不同
如有些字符才用单字节,有些使用两个或多个字节

Unicode设计目的正式为了解决这一问题,Unicode在设计之初被定义为两个字节,即65535个代码值
由于加入了诸多汉语,日语,韩语的表意字符,Unicode字符如今已经超过了65535个,16位的char类型已经不能满足表述所有的Unicode字符了

Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)

字符集

字符集为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)

码点(code point)

码点是指一个编码表中的某个字符对应的代码值

在Unicode标准中码点才用16进制表示,并加上前缀U+
如U+0041就是表示拉丁字母A的码点

Unicode的码点可以分成17个代码平面(code plane)

代码平面(code plane)

Unicode的码点可以分成17个代码平面(code plane)

第一个代码平面称为基本多语言平面(basic multilingual plane),包括码点从U+0000到U+ffff的经典Unicode代码

其余16个平面为从U+10000到U+10ffff的辅助字符(supplementy character)

UTF-16(编码规则)

编码规则

编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)

UTF-8是采用16位为一个**代码单元(code unit)**的可变长编码规则

代码单元

在UTF-16中,用16位表示基本多语言平面中的字符,而表示基本多语言平面的空间长度成为一个代码单元

UTF-16使用16位的代码单元表示基本多语言平面字符,而辅助字符则使用一对连续的代码单元表示

辅助字符的代码单元使用基本多语言平面中未使用的2048个编码值为范围,称为替代区域(surrogate area),其中U+D800~U+DBFF用于识别第一个代码单元,U+DC00~U+DFFF用于识别第二个代码单元

这样做可以快速识别代码单元究竟是一个代码单元的基本多语言平面中的Unicode经典代码的字符编码,还是两个代码单元的辅助字符第一或第二部分

如θ是八元数集的一个数学符号,码点为U+1D546,超出了Unicode的基本多语言平面,属于辅助字符,UTF-16中使用两个代码单元存储即U+D835和U+DD46

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列队猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值