码点与代码单元

java string有两种判定字符的方式,一种是以码点,一种以代码单元,简单讲,码点就是真正的字符,代码单元是按大小即char型长度2个字节划分字符串。
所以length和charat方法都不能正确的表示我们所认为的字符数量个字符位置

关于 Character 摘自jdk文档

char数据类型(因此Character对象封装的值)基于原始Unicode规范,其将字符定义为固定宽度的16位实体。 Unicode标准已经被更改为允许其表示需要超过16位的字符。 法定代码点的范围现在是U + 0000到U + 10FFFF,称为Unicode标量值 。 (请参阅Unicode标准中U + n符号的 definition。 )

The set of characters from U+0000 to U+FFFF有时被称为基本多语言平面(BMP) 。 其代码点大于U + FFFF的Characters称为补充字符 s。 Java平台在char阵列和String和StringBuffer类中使用UTF-16表示形式。 在该表示中,补充字符表示为char值,第一个来自高替代范围( uD800-  uDBFF),第二个来自低代理范围( uDC00-  uDFFF)。

因此,值char表示基本多语言平面(BMP)代码点,包括代码代码点或UTF-16编码的代码单元。 一个int值代表所有Unicode代码点,包括补充代码点。 int的较低(最低有效)21位用于表示Unicode码点,而高(最高有效)11位必须为零。 除非另有说明,关于补充字符和char值的行为如下:

仅接受char值的方法不能支持补充字符。 他们将char值从代理范围视为未定义的字符。 例如, Character.isLetter('\uD840')返回false ,即使这个特定值如果后面是字符串中的任何低代理值都将代表一个字母。
接受int值的方法支持所有Unicode字符,包括补充字符。 例如, Character.isLetter(0x2F81A)返回true因为代码点值代表一个字母(CJK表意文字)。

关于unicode-16摘自百度

UTF-16编码以16位无符号整数为单位。我们把Unicode
unicode
unicode
编码记作U。编码规则如下:
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。
如果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。
按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。可见,第一个WORD的取值范围(二进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二个WORD的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。
为了将一个WORD的UTF-16编码与两个WORD的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):
D800-DB7F
High Surrogates
高位替代
DB80-DBFF
High Private Use Surrogates
高位专用替代
DC00-DFFF
Low Surrogates
低位替代
高位替代就是指这个范围的码位是两个WORD的UTF-16编码的第一个WORD。低位替代就是指这个范围的码位是两个WORD的UTF-16编码的第二个WORD。那么,高位专用替代是什么意思?我们来解答这个问题,顺便看看怎么由UTF-16编码推导Unicode编码。
如果一个字符的UTF-16编码的第一个WORD在0xDB80到0xDBFF之间,那么它的Unicode编码在什么范围内?我们知道第二个WORD的取值范围是0xDC00-0xDFFF,所以这个字符的UTF-16编码范围应该是0xDB80 0xDC00到0xDBFF 0xDFFF。我们将这个范围写成二进制:
1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111
按照编码的相反步骤,取出高低WORD的后10位,并拼在一起,得到
1110 0000 0000 0000 0000 - 1111 1111 1111 1111 1111
XML
XML
即0xe0000-0xfffff,按照编码的相反步骤再加上0x10000,得到0xf0000-0x10ffff。这就是UTF-16编码的第一个WORD在0xdb80到0xdbff之间的Unicode编码范围,即平面15和平面16。因为Unicode标准将平面15和平面16都作为专用区,所以0xDB80到0xDBFF之间的保留码位被称作高位专用替代[1] 。

转载于:https://www.cnblogs.com/gjl-blog/p/8538752.html

java unicode补充字符带来的码点和代码单元问题相关推荐

  1. Java学习之字符与ASCII码相互转换的面板设计

    此代码主要是设计一个小面板,在面板内可以实现字符与ASCII码的相互转换,代码如下: package cm.test.demo10;import java.awt.*; import java.awt ...

  2. Java核心技术卷I基础知识3.6.6 码点与代码单元

    3.6.6 码点与代码单元 Java字符串由char值序列组成.从3.3.3节"char类型"已经看到,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元. ...

  3. java代码点_Java中码点和代码单元

    Java中码点和代码单元 前言 码点和代码单元这两个概念还是在<Java核心技术 卷一>发现的,这也是我看过这本书里面前五章中比较有用的一个知识点(PS:毕竟Java开发都一年了,基础应用 ...

  4. Java中码点和代码单元

    Java中码点和代码单元 前言 码点和代码单元这两个概念还是在<Java核心技术 卷一>发现的,这也是我看过这本书里面前五章中比较有用的一个知识点(PS:毕竟Java开发都一年了,基础应用 ...

  5. Java码点和代码单元的理解

    Java码点和代码单元的理解 书本中的相关概念 码点 定义 码点(code point)是指与一个编码表中的某个字符对应的代码值 代码单元 定义 在基本多语言平面中,每个字符用16位表示,通常称为代码 ...

  6. 3.6.6 码点与代码单元

    Java字符串由char值序列组成.char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示 ...

  7. 什么是码点与代码单元

    什么是码点与代码单元 前言 一.什么是码点 二.什么是代码单元 三.书中实例 四.参考文章 前言 最近在学习Java,参考书籍是<Java核心技术>,在学习到码点和代码单元时,有点搞不懂这 ...

  8. 字符串的相关操作(定义、拼接、比较、判断字符串是否为空串或null串、查看码点或代码单元、遍历字符串等)

    本文为原创文章,转载请注明出处!! https://blog.csdn.net/featureA/article/details/123476271 ------------------------- ...

  9. String类型的字符长度(码点/代码单元的区别)

    查看String的源码可以发现它以一个char类型的数组保存字符串的,而String.length()方法返回的也是这个char数组的长度. 那么,这个长度和"字符"长度有什么关系 ...

最新文章

  1. 刚刚用华为鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生....
  2. redis(18)--发布和订阅
  3. Ubuntu下各种服务搭建及操作技巧
  4. kotlin 类和对象_Kotlin程序| 类和对象的示例(带有学生数据)
  5. library的英语怎么读音_如何让你的英语口音无限接近母语者?英语语音语调的独家训练方法...
  6. 31、栈的压入、弹出序列(Python)
  7. mysql的架构及查询sql的执行流程(二)
  8. DEA博弈交叉效率matlab,基于博弈交叉效率DEA模型的服务模块化创新绩效测量—以江西省文化创意产业为例...
  9. 支持iphone的打印服务器,无需购买WiFi打印机,实现电脑、iPad、iPhone共享无线打印...
  10. 汇编实验 用Radasm设计生成一个对话框,实现如图1.1所示的四则运算计算器
  11. 微信公众号通知和服务通知
  12. 调试经验——用XML格式定义Excel (.xls格式)文件 (XML Spreadsheet format in Excel)
  13. nginx配置Strict Transport Security
  14. 北航学生因海淘填写学校地址遭封号!美国「制裁清单」影响开始深入校园!
  15. uniapp 自定义下拉框
  16. libreCAD源码阅读笔记2
  17. Grapher如何控制单个条目图例中的样本大小丨使用教程
  18. FIddler+Proxifer 实现PC客户端抓包
  19. Docker镜像原理及容器数据卷
  20. 一个菜鸟对建站的一点看法

热门文章

  1. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态
  2. SwiftUI 发展现状和学习指南
  3. iOS安全之class-dump的安装和使用
  4. (0047)iOS开发之nil/Nil/NULL的区别
  5. redis 通过aof日志恢复_Redis之-aof恢复
  6. 我爱Java系列---【mysql基础约束】
  7. 大二暑假周进度报告之四
  8. Python-基础知识-常用模块
  9. nginx 做负载均衡
  10. HTML5和CSS3响应式WEB设计指南译者序