大家好,欢迎来到IT知识分享网。
码点、代码单元、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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/91331.html