网站首页 > 文章精选 正文
码点、代码单元、length方法、codePointCount方法的一些心得
- length()方法
- codePointCount()方法
- length()方法和codePointCount()方法的区别
- 码点
- 代码单元
码点、代码单元、length()、codePointCount()
下面是我在阅读《Java核心技术卷Ⅰ》中的两段代码:
//String greeting = "Hello";
int n = greeting.length(); //is 5
//String greeting = "Hello";
int cpCount = greeting.codePointCount(0, greeting.length());// is 5
length方法将返回采用UTF-16编码表示给定字符串所需要的代码单元数量。例如:
String greeting = “Hello”;
int n = greeting.length(); //is 5
要想得到实际的长度,即码点数量,可以调用:
int cpCount = greeting.codePointCount(0, greeting.length());
——《Java核心技术卷Ⅰ》P48
这两段代码的结果都是5,这让我感到非常地困惑:同样的结果,第二段代码的意义在哪?
结合上下文和查阅一些资料,我再梳理了一下:
length()方法
Returns the length of this string. The length is equal to the number of Unicode code units in the string.
返回此字符串的长度。长度等于字符串中的Unicode代码单元数。
codePointCount()方法
Returns the number of Unicode code points in the specified text range of this String.
返回此字符串指定文本范围内的Unicode码点数。
length()方法和codePointCount()方法的区别
从返回值可以看出:length()方法返回的是代码单元,codePointCount()方法返回的是码点,而代码单元和码点究竟是上面呢,它们有什么区别呢?
length() | codePointCount() |
返回此字符串的长度。长度等于字符串中的Unicode代码单元数。 | 返回此字符串指定文本范围内的Unicode码点数 |
- 从下面这个例子的结果来看,码点和代码单元似乎没有区别。
public class Test {
public static void main(String []args) {
String greeting = "Hello";
int n = greeting.length();
int cpCount = greeting.codePointCount(0, greeting.length());
System.out.println(n);
System.out.println(cpCount);
}
}
- 但是从这个例子就可以看出码点和代码单元的不同了。下面我们就来聊一下码点和代码单元。
public class Test {
public static void main(String []args) {
String greeting = "Hello";
int n = greeting.length();
int cpCount = greeting.codePointCount(0, greeting.length());
System.out.println(n);
System.out.println(cpCount);
System.out.println("=");
String str = "";
System.out.println(str.length());
System.out.println(str.codePointCount(0, str.length()));
}
}
码点
在我的理解中,码点就是你实际看到的每一个字符,比如a、1、%、等都算作一个码点。
码点(Code Point)
码点是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用了十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。Unicode的码点可以分成17个代码平面。第一个代码平面称为基本多语言平面,包括码点从U+0000到U+FFFF的经典Unicode代码,其余的16个平面的码点为从U+10000到U+10FFFF,包括辅助字符。
——《Java核心技术卷Ⅰ》P33
代码单元
而代码单元就不一定是你实际看到的每一个字符,有可能你实际看到的字符是包含一个代码单元,也有可能包含两个代码单元,这是因为:
Java的字符串由char类型序列组成,而char类型原本是用来表示单个字符的,但是由于Unicode编码的机制,16位的char类型已经无法满足描述所有的Unicode字符的需要了,那么有些Unicode字符就需要两个char值表示,则可对应上下文中的高亮字体:一个代码单元时一个字符的编码。
代码单元(Code Unit)
UTF-16编码采用不同长度的编码表示所有Unicode编码。在基本多语言平面中,每个字符用16位表示,称为代码单元。辅助字符编码为一对连续的代码单元。采用这种编码对表示的各个值落入基本多语言平面中未用的2048个值范围内,通常称为替代区域。这样设计十分巧妙,我们可以从中迅速知道一个代码单元时一个字符的编码,还是辅助字符的第一或第二部分。
——《Java核心技术卷Ⅰ》P33
猜你喜欢
- 2024-12-31 面试须知:通常都要知道的TCP、HTTP知识点
- 2024-12-31 excel函数——常用的字符串函数(二)
- 2024-12-31 小小的字符串,在PLC编程中不容小觑,到底有何特别 ?
- 2024-12-31 玩转Python—字符串使用教程
- 2024-12-31 vlookup的高阶用法——数据提取,不是很简单,但是很实用
- 2024-12-31 替换函数Substitute,用法大全,值得收藏备用
- 2024-12-31 C++基础算法:统计字符数
- 2024-12-31 Java基础面试:一文看懂String类中的常用方法
- 2024-12-31 老司机归纳-经典SQL语句(二)
- 2024-12-31 32767、8192、255在Excel中这三个数有什么含义?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)