代码点与代码单元和Unicode相关的UTF

本文深入探讨了Unicode字符集中的代码点与代码单元概念,以及它们在UTF-8、UTF-16和UTF-32编码中的表现。代码点是Unicode中为字符分配的唯一数字,而代码单元是编码表示时的最小单位。UTF-8是一种可变长度的编码方式,根据字符的不同范围使用1-4个字节。UTF-16和UTF-32则分别使用1-2个和4个字节。文章还介绍了Unicode与ASCII的差异,以及字符编码在不同系统和标准中的兼容性问题。
摘要由CSDN通过智能技术生成
java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元来表示,length方法返回的是采用UTF-16编码表示的给定字符串所需要的代码单元的数量,要想得到真实的长度即代码点的数量可以调用xxx.codePointCount(0,xxx.length())方法。
为什么那么关注代码点和代码单元,因为在处理字符串时使用length和charAt方法时返回的是编码表示下的代码单元数量而不是认为的字符个数,在一个字符串内如果有使用多个代码单元表示的字符,在使用以上的方法时会出现检索错误。

那什么是代码点什么是代码单元?
代码点(code point):unicode是属于编码字符集(CSS)的范围,将需要表示的字符表中的每个字符映射成一个数字,这个数字被称为码点,代码点是字符集被编码后出现的概念,为了计算机使用这些所以出现了编号,这些编码了的字符集叫做编码字符集这个编号i就是代码点,指与一个编码表中的某个字符对应的代码值,在Unicode标准中代码点采用十六进制书写并加上前缀U+,Unicode代码点分为17个级别,第一个代码级别称为基本的多语言组别,代码点从U+0000到U+FFFF,其余的16个附加级别,代码点从U+10000到U+10FFFF包括了一些辅助字符
代码单元(code unit):是指一个以编码的文本中具有最短的比特组合的单元,在基本的多语言级别中每个字符用16位表示,通常被称为代码单元。

总结一下代码点是为字符分配的编号,一个字符占一个代码点,而代码单元则是针对编码方法而言的,因为一个字符可以编译为一个字节,两个字节或者三四个字节。所以一个字符对应一个代码点但是可以有多个代码单元,当你想以一种方式指定自己使用什么字符的时候使用代码点,即告诉程序你使用的是第几个字符,而在不同的情况使用不同的代码单元,因为需要区分不同的情况。

Unicode包含两个步骤首先是定义一个规范,给所有的字符指定一个唯一对应的数字,之后才是把字符对应的数字保存在计算机中,所以在保存到计算机内时就会有不同的保存方式就会有多种UTF形式,字节编码方案是从一个或者多个编码字符集到一个或多个固定宽度代码单元序列的映射,最常用的代码单元是字节,UTF-32、UTF-16、UTF-8是Unicode标准的编码字符集的字符编码方案。

UTF-8:使用一至四个字节的序列对编码Unicode代码点进行编码。U+0000至U+007F使用一个字节编码,U+0080至U+07FF使用两个字节,U+0800至U+FFFF使用三个字节,而U+10000至U+10FFFF使用四个字节。UTF-8设计原理为:字节值0x00至0x7F始终表示代码点U+0000至U+007F(Basic Latin字符子集,它对应ASCII字符集)。这些字节值永远不会表示其他代码点,这一特性使UTF-8可以很方便地在软件中将特殊的含义赋予某些ASCII字符。最大特点是一种可变长的编码方式,根据不同的符号而变化字节长度,对应于英语字母UTF-8编码和Ascii编码是一样的,但是对于n字节的符号第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制位,全部为这个符号的unicode编码,在计算机内存中统一使用unicode编码,当需要保存到硬盘或者传输的时候就转换到UTF-8,一般在网页中也是又服务器里的unicode编码转换为UTF-8后到浏览器上。 UTF-8有点类似于Haffman编码,它将Unicode编码为00000000-0000007F的字符,用单个字节来表示; 00000080-000007FF的字符用两个字节表示 ;00000800-0000FFFF的字符用3字节表示。因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说,UTF-8最多需要用6字节表示一个字符。 


UTF-16:使用一个或两个未分配的16位代码单元为单位的序列对Unicode代码点进行编码。值U+0000至U+FFFF编码为一个相同值的16位单元。增补字符编码为两个代码单元,第一个单元来自于高代理范围(U+D800至U+DBFF),
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值