网站首页 > 精选教程 正文
3.6.6 码点与代码单元
Java字符串是一个char 值序列。从3.3.3节已经看到,char 数据类型是采用UTF-16编码表示Unicode码点的一个代码单元。最常用的Unicode字符串可以用一个代码单元表示,而辅助字符需要一对代码单元表示。
length方法将返回采用UTF-16编码表示给定字符串所需要的代码单元个数。例如:
String greeting =“Hello”;
int n = greeting.length();// 5
要想得到实际长度,即码点个数,可以调用:
int cpCount = greeting.codePointCount(0,greeting.length());
调用s.charAt(n)将返回位置n 的代码单元,n的范围是 0~s.length()-1。例如:
char first = greeting.chatAt(0);// H
char last = greeting.charAt(4);// o
要想得到第 i 个码点,可以使用以下语句:
int index = greeting.offsetByCodePoints(0,i);
int cp = greeting.codePointAt(index);
为什么会对代码单元如此大惊小怪?请考虑下面这个句子
String sentence = “is the set of octonions.”;
使用UTF-16编码表示字符(U+1D546)需要两个代码单元。调用 char ch = sentence.charAt(1)
返回的不是一个空格,而是的第二个代码单元。为了避免这个问题,不要使用char 类型。这太底层了。
注释:不要以为可以忽略代码单元在U+FFFF以上的奇怪字符,喜欢 emoji 表情符号的用户可能会在字符串中加入类似(U+1F37A,啤酒杯)的字符
如果想要遍历一个字符串,并且依次每一个码点,可以使用以下语句:
int cp = sentence.codePointAt(i);
i += Character.charCount(cp);
可以使用以下语句实现反向遍历:
i--;
if(Character.isSurrogate(sentence.charAt(i))) i--;
int cp = sentence.codePointAt(i);
显然,这很麻烦。更容易的办法是使用 codePoints 方法,它会生成 int 值的一个“流”,每个int 值对应一个码点。(流在卷2中介绍)可以将流转为一个数组(见3.10节)再完成遍历。
int[] codePoints = str.codePoints().toArray();
反之,要把一个码点数组转为一个字符串,可以使用构造器(我们将在第4章详细讨论构造器和 new 操作符)。
String str = new String(codePoints,0,codePoints.length);
要把单个码点转换为一个字符串,可以使用 Character.toString(int)方法:
int codePoint = 0x1F37A;
str = Character.toString(codePoint);
注释:虚拟机不一定把字符串实现为代码单元序列。在Java9中使用了一个更紧凑的表示。只包含单字节代码单元的字符串使用byte数组实现,所有其他字符串使用char 数组。
猜你喜欢
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.3相等测试与继承
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.4 hashCode方法
- 2024-11-28 Java入门书单
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3.7 隐式参数与显式参数
- 2024-11-28 全网最完整的免费java教程讲义系列(四)——java的流程控制
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.6 对象构造 4.6.1重载
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 3.10 数组
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3 自定义类
- 2024-11-28 2019年Java核心技术我整理了200多页pdf,今天分享给你
- 2024-11-28 java 核心技术12版卷1 - 1.3 Java applet 与 Internet
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)