String中的码点和代码单元你听过吗?

String 算是java开发中用到最多的一个对象了吧。其中的码点和代码单元的概念你听过吗,下面简单的介绍一下吧

如果不知道的话,你先看一下下面的代码输出的字符串长度是多少?

        System.out.println("a🥧c".length());

下面就介绍以下码点和代码单元的慨念吧

码点(Code Point)是Unicode字符集中每个字符的唯一标识符,它用一个整数值来表示。在Java中,一个码点对应一个int类型的值,可以通过codePointAt()方法获取字符串中指定位置的码点(就我们视觉上看到的一个字符)。

代码单元(Code Unit)是在内存中存储和处理字符串时使用的基本单位。在Java中,使用UTF-16编码方案将Unicode字符编码为代码单元。UTF-16使用16位无符号整数(即char类型)来表示一个代码单元,对于表示较大的码点,需要使用多个代码单元进行编码。(java的char类型就是代码单元呢)

在大多数情况下,一个代码单元就可以表示一个Unicode字符,此时一个代码单元就等于一个码点。但是对于一些辅助字符(Surrogate Character),一个码点需要使用两个代码单元来表示。这是因为Unicode字符集中的一些字符编码超过了16位的范围,需要使用代理对(Surrogate Pair)来进行编码。

以下是一些处理码点和代码单元的方法:

  1. length()方法返回字符串中代码单元的数量。
String str = "a🥧c";
int codeUnits = str.length(); // codeUnits = 4
  1. codePointCount(int beginIndex, int endIndex)方法返回指定范围内的码点数量。
String str = "a🥧c";
int codePoints = str.codePoints().count(); // codePoints = 3
  1. charAt(int index)方法返回指定位置的代码单元。
String str = "a🥧c";
char ch = str.charAt(1); // ch = '?'
  1. codePointAt(int index)方法返回指定位置的码点。
String str = "a🥧c";
int codePoint = str.codePointAt(1); // codePoint = 129383

看到这儿我们在平时遍历字符串时候,其实我们意图是遍历码点,只是平时开发中很少遇到两个单码单元的码点就基本上不会出问题。因此我们以后在处理字符串时,特别是在涉及到索引、截取和遍历操作时,应当考虑码点和代码单元之间的关系,以避免出现问题。

比如在我们不清楚码点和代码单元的关系之前,要提取 “a🥧c” 中间这个字符,我们可能直接 str.charAt(1) 了,这时候程序就跑远了,嘻嘻嘻嘻。。。。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不务专业的程序员--阿飞

兄弟们能否给口饭吃

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

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

打赏作者

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

抵扣说明:

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

余额充值