关于码点、代码单元、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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fqlll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值