代码点与代码单元和Unicode相关的UTF_代码的ut ui-程序员宅基地

技术标签: Java  java  utf-8  历史  unicode  

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),
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ZytheMoon/article/details/79124066

智能推荐

10分钟学会python写游戏脚本!Python其实很简单_手游刷初始号的脚本怎么写-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏51次。最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简单的体验方法就是下载一个Airtest了,直接截几个图片,写几层代码,就可以按照自己的逻辑玩儿游戏了。当然,本篇文章不是要讲Airtest这个怎么用,而是用原始的python+opencv来实现上面的操作。_手游刷初始号的脚本怎么写

CAD绿色版教程-程序员宅基地

文章浏览阅读10次。CAD绿色版下载地址百度网盘CAD完全卸载

nacos开启鉴权(nacos.core.auth.enabled=true)提示unknown user!-程序员宅基地

文章浏览阅读3.9k次。nacos开启鉴权提示unknown user!_nacos.core.auth.enabled=true

PLC对接MES、PLC数据上报、PLC之间通讯_plc与数据库通讯-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏64次。服务器数据上报查询SQLServer/MySQL数据库查询(SELECT)/上报(INSERT);相关案例PLC查询PC数据库中的数据返回到寄存器MQTT协议JSON/XML发布/订阅;HTTP/FTP协议文件解析、上传下载;专用协议与主站设备双向数据通讯;PLC数据寄存器地址、数据类型可自由配置,支持有线网口/WIFI/4G通讯,无需二次开发。 PLC串口扩展/转..._plc与数据库通讯

线性最小二乘问题_线性最小二乘法-程序员宅基地

文章浏览阅读4.5k次,点赞10次,收藏28次。线性最小二乘问题线性最小二乘是一种求解线性系统参数的方法,即参数估计的方法。它的特点有:需要已知参数与观察量之间的线性函数关系存在多余观测线性最小二乘原理线性关系对于一个参数估计问题,我们往往不能直接获得想要的参数值,需要通过间接观测的方式去反向求解。例如:为了确定一辆车的平均速度,我们不能直接测量得到,我们是间接的借助单位时间内的路程,以及时间来反算速度。为了获得我在世界上的GPS位置,我们总是间接的借助卫星的位置,以及卫星到我们的距离来推算我们当前的位置。可以看到很多很多问题_线性最小二乘法

94个JAVA计算机毕业设计必做项目,你想要的一网打尽-程序员宅基地

文章浏览阅读27次。Springboot面向社区的洗衣店智能服务系统设计与实现808ub。Springboot无人之境智能酒店服务平台的设计与实现k719z。Springboot中电科海信院培训考试系统的设计与实现o2rr4。Springboot中心医院药品管理系统的设计与实现8pk94。Springboot企业人事管理系统的设计与实现114b3。Springboot小型仓库管理系统的设计与实现ihpgf。Springboot事业单位内部的财务管理系统8rtd3。Springboot课堂考勤管理系统设计与实现o2j18。

随便推点

1.2闪聚支付 第1章 讲义-项目介绍与环境搭建_黑马闪聚支付项目配置文件-程序员宅基地

文章浏览阅读1.9k次。闪聚支付 第1章 讲义-开发环境搭建_黑马闪聚支付项目配置文件

ElasticSearch之ES8新特性及集群安装_elasticsearch8 新特性-程序员宅基地

ElasticSearch 8有新特性并介绍了集群安装方法。要求至少启动两个节点以成功重置密码。

OSChina 周五乱弹 —— 那地图上的点到底去哪儿-程序员宅基地

文章浏览阅读116次。2019独角兽企业重金招聘Python工程师标准>>> ..._wochao 第一声

python ordereddict_Python标准库使用OrderedDict类的实例讲解-程序员宅基地

文章浏览阅读135次。目标:创建一个字典,记录几对python词语,使用OrderedDict类来写,并按顺序输出。写完报错:[root@centos7 tmp]# python python_terms.pyFile "python_terms.py", line 9from name,language in python_terms.items():^SyntaxError: invalid syntax代码如下:..._python ordereddict 循环输出

RabbitMQ的使用_rabbitmq system.in.read()-程序员宅基地

文章浏览阅读1.2k次。目录RabbitMQ的使用一.Java连接RabbitMQ1.1创建Maven项目1.2导入依赖1.3创建工具类连接RabbitMQ二.通讯方式1.Hello-World2.Work3.Publish/Subscribe4.Routing5.TopicRabbitMQ的使用一.Java连接RabbitMQ1.1创建Maven项目pass 。。。。1.2导入依赖<dependencies> <dependen._rabbitmq system.in.read()

浅谈对象内存分配问题_对象分配问题-程序员宅基地

文章浏览阅读225次。堆,又叫自由存储区,它是在程序执行的过程中动态分配的,所以它最大的特性就是动态性。在C++中,所有堆对象的创建和销毁都要由程序员负责,所以,如果处理不好,就会发生内存问题。如果分配了堆对象,却忘记了释放,就会产生内存泄漏;而如果已释放了对象,却没有将相应的指针置为NULL,该指针就是所谓的“悬挂指针”,再度使用此指针时,就会出现非法访问,严重时就导致程序崩溃。  那么,C++中_对象分配问题

推荐文章

热门文章

相关标签