py遍历字符串的每个字符_“你的字符串遍历对了吗?”
前 言
最近小编在看《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遍历字符串的每个字符_“你的字符串遍历对了吗?”相关推荐
- 字符串删除重复字符_高效的字符串清理-删除内部重复空间
字符串删除重复字符 介绍 (Introduction) 我经常回答一些问题,其中的字符串需要"清除"多个空格字符. 最常见的解决方法是删除前导或尾随空格. 对于这个问题,有非常方便 ...
- Python统计一个字符串中所有字符在另一个字符串出现的总次数
代码功能:统计一个字符串中所有字符在另一个字符串中出现的总次数. 技术要点:函数式编程. 可能的应用:垃圾邮件分类.在大部分垃圾邮件中,为了防止被分类为垃圾邮件,会在一些关键字中间插入类似于[.].* ...
- mysl首字的首字母、字符串的各个字符首字母、字符串所有拼音查询(超详细)
mysl首字的首字母.字符串的各个字符首字母.字符串所有拼音查询 1.创建查询测试数据库表 2.向数据库表添加测试信息 3.sql根据首字的首字母查询 4.sql根据字符串的各个字符首字母查询 5.s ...
- vue字符串替换,vue将字符串内指定字符替换,vue字符串替换函数.replace如何使用
vue字符串替换,vue将字符串内指定字符替换,vue字符串替换函数.replace如何使用 需求:将原字符串内的2022替换成2023 源码 //原字符串 const ystring=2022-02 ...
- python处理字符_常用python字符串处理
import re p = re.compile(r'\d+') print p.split('one1two2three3four4') ### output ### # ['one', 'two' ...
- stl取出字符串中的字符_从C ++ STL中的字符串访问字符元素
stl取出字符串中的字符 字符串作为数据类型 (String as datatype) In C, we know string basically a character array termina ...
- java 字符串第一个字符_深入Java源码剖析之字符串常量
字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键.那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个 ...
- stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串
stl取出字符串中的字符 字符串作为数据类型 (String as datatype) In C, we know string basically a character array termina ...
- 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据
oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用 收藏 常用函数:substr和instr 1.SUBSTR(string,s ...
最新文章
- 任正非内部重磅发言:华为不可能简单学阿里、亚马逊
- 手机直播系统源码搭建说明
- jmeter脚本结合ant执行测试用例并生成测试报告
- Firefox 4网页演示:宣布Web O’Wonder的奇迹
- matlab怎么打出角频率,[Matlab]频率f,角频率Ω和数字频率w的物理含义
- asp.net mvc4 mysql_ASP.NET MVC4 with MySQL: Configuration Error (MySql.Web.v20)
- win10系统安装jdk8全过程
- 数据处理中常用的Excel函数
- Codeforces Round #306 (Div. 2)
- 计算机绘图教程简单,工程制图CAD计算机绘图指导教程
- Jetpack ViewBinding
- JS实现拼音(字母)匹配(搜索)汉字(姓名)
- 牛啊,全国DNS服务器IP地址都在这里了
- Coursera | Applied Plotting, Charting Data Representation in Python(UMich)| Assignment4
- 【微信小程序】引入Base64 图标库
- dma-buf 由浅入深(三) —— map attachment
- ROS张瑞雷老师布置作业第一天作业
- python基础-数据类型
- .Net Core 源码解析
- 【如何使用Excel实现包含关系】