前 言

最近小编在看《Java核心技术 卷一》,遇到有趣或者难以理解的地方就和大家分享一下。希望我们能共同进步,以梦为马,不负韶华。 字符串遍历似乎是一个很基础同时也很简单的问题,但是字符串遍历真的简单吗?你了解字符在Java中的编码方式吗?相信所有程序员都遇到过各种各样的bug,令人最头疼的无异于找bug和修改bug,“万丈高楼平地起”,为了避免今后写大型项目时bug的出现,打好基础是很有必要的。 话不多说,开始进入正题吧。

正 文

首先需要了解字符在Java中的编码方式。 01、char类型Collision Resistance char类型用于表示单个字符,java中一个char类型占据2个字节即16位。 例如: ‘A’是编码为65(十进制)或41(16进制)或0000 0000 0100 0001(2进制,计算机中存放的值)所对应字符常量。 ‘中’是编码为20013(十进制)或4E2D(16进制)所对应字符常量。 ‘国’是编码为22269(十进制)或56FD(16进制)所对应字符常量。 02、Unicode码 Collision Resistance Unicode是一种字符编码方式,即字符与Unicode码的一一映射。 在20世纪80年代开始设计Unicode编码时,人们认为两个字节(16位,共65536个字符)的代码宽度足以能对世界上各种语言的所有字符进行编码,并有足够的空间留给未来扩展。 在1991年发布了Unicode 1.0(\u0000~\uFFFF),仅使用了65536个代码值中不到一半的部分。 遗憾的是,由于引入大量汉语、日语和韩国语言中的表意文字,Unicode字符最终超过了65536个,即16位的char类型不能满足全部的Unicode字符。 所以Java怎么解决这个问题呢? 简单粗糙的理解就是,一部分字符用一个char来表示,另一部分字符用两个char来表示。 想要知道具体的实现过程吗,接下来将进行更为细致的解释。 首先定义一个概念“代码点”。 03、代码点 Collision Resistance 代码点指与一个编码表中的某个字符对应的代码值。代码点采用十六进制书写,并加上前缀U+。 专业术语的解释看起来不太好理解,举个简单的例子: 前面提到了‘A’、‘中’、‘国’三个字符的编码,其对应Unicode码分别为\u0041、\u4E2D、\u56FD。其对应的代码点分别为:

字符

代码点

'A'

U+0041

'中'

U+4E2D

'国'

U+56FD

很显然,代码点就是Unicode码的代码值。 以上所举的例子都是在\u0000~\uFFFF (65536个代码值)范围内的字符。在16位的Unicode字符集不够用时,将其扩展为\u000000~\u10FFFF(1114112个代码值)。 例如:整数集合的数学符号‘Z’,Unicode码为\u1D56B

字符

代码点

'Z'(整数集合符号)

U+1D56B

Unicode编码是理论上的研究,技术上的具体实现方法有UTF-8、UTF-16、UTF-32。在Java中,char类型使用UTF-16编码来实现Unicode码。

04、代码单元 Collision Resistance

UTF-16编码中两个字节即16位表示一个代码单元。代码单元(code unit):在基础多语言级别中,每个字符用16位表示(即代码单元);而辅助字符采用一对连续的代码单元进行编码.

05、UTF-16编码 Collision Resistance UTF-16编码采用不同长度的编码表示所有的Unicode代码点。首先将Unicode代码点分为两部分,一部分是基本的多语言级别(\u0000~\uFFFF),另一部分是辅助字符(\u10000~\10FFFF)。 其中基本的多语言级别中每个字符用16位表示即一个代码单元(一个char);辅助字符采用两个代码单元(char[2])进行编码。

如上图显示了UTF-16编码与Unicode码的对应关系。UTF-16深灰色部分与Unicode深灰色部分一一对应,同理浅灰色部分也是一一对应关系。Unicode中\uD800~\uDFFF(2048字节)为空闲区域即不表示任何字符。Unicode中辅助字符使用UTF-16中替代区域进行编码,即一个辅助字符由两个代码单元表示,其中第一个代码单元范围是D800~DBFF,第二个代码单元范围是DC00~DFFF。这种设计十分巧妙,通过判断代码单元的所属范围,就可以很容易的知道该代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。

字符

代码点

代码单元

'中'

U+4E2D

U+4E2D

'国'

U+56FD

U+56FD

'Z'(整数集合符号)

U+1D56B

U+D835

U+DD68

以上就是代码点和代码单元的全部解释内容,接下来用代码实现一下字符串遍历吧。

06、应用及实现 Collision Resistance

如何使用Java遍历字符串呢?

String str = "Hello World!";       for(int i=0;i           System.out.print(str.charAt(i));        }

没有学代码点和代码单元的知识时,小编就是这样写的代码,看起来很简单呀。但是要注意length()方法返回的是代码单元的数量charAt()方法返回的是第i个位置的代码单元,这两个方法都是与代码单元有关。 当字符串内包含辅助字符时,这种方法还适用吗? 答案很显然是不适用,因为辅助字符中一个字符由两个代码单元组成,这时应该利用代码点有关的方法来遍历字符串。   codePointCount(0,str.length()) 方法:返回代码点数量 codePointAt(i) 方法:返回第i个代码点处的字符,注意返回的是int类型

String str = "\uD875\uDD68 is the set of integers";System.out.println(str);System.out.printf("第一种方法字符总数:%d\n",str.length());//错误的解法for(int i=0;i  System.out.printf("第%d个字符:",i);  System.out.print(str.charAt(i)+" ");}System.out.print('\n');System.out.printf("第二种方法字符总数:%d\n",str.codePointCount(0,str.length()));for(int i=0;i    int ch = str.codePointAt(i);    System.out.printf("第%d个字符:",i);    System.out.print((char)ch);    if(Character.isSupplementaryCodePoint(ch))       i+=2;    else       i++;    }    

最 后

代码点和代码单元在《Java核心技术 卷一》中3.3.3和3.6中都有提到,有兴趣的小伙伴可以去了解一下。 以上内容是否对你学习Java带来了一些帮助和启示呢? 如本篇博客有任何错误或有你感兴趣的内容,欢迎联系我们(resistantcolli@163.com),让我们一起共同进步 吧。

py遍历字符串的每个字符_“你的字符串遍历对了吗?”相关推荐

  1. 字符串删除重复字符_高效的字符串清理-删除内部重复空间

    字符串删除重复字符 介绍 (Introduction) 我经常回答一些问题,其中的字符串需要"清除"多个空格字符. 最常见的解决方法是删除前导或尾随空格. 对于这个问题,有非常方便 ...

  2. Python统计一个字符串中所有字符在另一个字符串出现的总次数

    代码功能:统计一个字符串中所有字符在另一个字符串中出现的总次数. 技术要点:函数式编程. 可能的应用:垃圾邮件分类.在大部分垃圾邮件中,为了防止被分类为垃圾邮件,会在一些关键字中间插入类似于[.].* ...

  3. mysl首字的首字母、字符串的各个字符首字母、字符串所有拼音查询(超详细)

    mysl首字的首字母.字符串的各个字符首字母.字符串所有拼音查询 1.创建查询测试数据库表 2.向数据库表添加测试信息 3.sql根据首字的首字母查询 4.sql根据字符串的各个字符首字母查询 5.s ...

  4. vue字符串替换,vue将字符串内指定字符替换,vue字符串替换函数.replace如何使用

    vue字符串替换,vue将字符串内指定字符替换,vue字符串替换函数.replace如何使用 需求:将原字符串内的2022替换成2023 源码 //原字符串 const ystring=2022-02 ...

  5. python处理字符_常用python字符串处理

    import re p = re.compile(r'\d+') print p.split('one1two2three3four4') ### output ### # ['one', 'two' ...

  6. stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素

    stl取出字符串中的字符 字符串作为数据类型 (String as datatype) In C, we know string basically a character array termina ...

  7. java 字符串第一个字符_深入Java源码剖析之字符串常量

    字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键.那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个 ...

  8. stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串

    stl取出字符串中的字符 字符串作为数据类型 (String as datatype) In C, we know string basically a character array termina ...

  9. 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据

    oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用 收藏 常用函数:substr和instr 1.SUBSTR(string,s ...

最新文章

  1. 任正非内部重磅发言:华为不可能简单学阿里、亚马逊
  2. 手机直播系统源码搭建说明
  3. jmeter脚本结合ant执行测试用例并生成测试报告
  4. Firefox 4网页演示:宣布Web O’Wonder的奇迹
  5. matlab怎么打出角频率,[Matlab]频率f,角频率Ω和数字频率w的物理含义
  6. asp.net mvc4 mysql_ASP.NET MVC4 with MySQL: Configuration Error (MySql.Web.v20)
  7. win10系统安装jdk8全过程
  8. 数据处理中常用的Excel函数
  9. Codeforces Round #306 (Div. 2)
  10. 计算机绘图教程简单,工程制图CAD计算机绘图指导教程
  11. Jetpack ViewBinding
  12. JS实现拼音(字母)匹配(搜索)汉字(姓名)
  13. 牛啊,全国DNS服务器IP地址都在这里了
  14. Coursera | Applied Plotting, Charting Data Representation in Python(UMich)| Assignment4
  15. 【微信小程序】引入Base64 图标库
  16. dma-buf 由浅入深(三) —— map attachment
  17. ROS张瑞雷老师布置作业第一天作业
  18. python基础-数据类型
  19. .Net Core 源码解析
  20. 【如何使用Excel实现包含关系】

热门文章

  1. Kafka Eagle服务部署
  2. solr实现同义词查询及分词粒度
  3. ansys谐响应分析
  4. 日语学习资料汇总(可下载)
  5. <<R语言入门与实践>>读书笔记
  6. 忘尘彼岸用计算机怎么弹出来,彼岸月华
  7. Python中关键字global与nonlocal的区别
  8. GPS反演潮位修复方法
  9. 商务通核心函数库代码(2)
  10. 树莓派3SD卡格式化-Windows下利用SDFormatter格式化SD卡