1、Java字符串有char值序列组成,而char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。
2、大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
3、Java对字符串中的代码单元和码点从0开始计数。
码点:Unicode编码表中每个字符对应的数值。有效范围从U+0000到U+10FFFF。其中U+0000到U+FFFF为基本字符,U+10000到U+10FFFF为辅助字符。
代码单元:对代码点进行编码得到的1或2个16位序列。
Java中String.length()方法返回的是代码单元的个数,而String.codePointCount(0, length)返回的是码点个数,即字符的个数。
①通常这两个值是一致的。
1 public static void main(String[] args) {
2 String s = "\u0041_ _\u0042"; // 字符串第3个字符是空格
3 System.out.println(s);
4 int lengthU = s.length();
5 int lengthP = s.codePointCount(0, lengthU);
6 System.out.println(lengthU); // 5个代码单元
7 System.out.println(lengthP); // 5个码点
8
9 }
结果为:
②字符串包含辅助字符是,这两个值不同。
1 public static void main(String[] args) {
2 String s = "\u0041_ _\uD835\uDD6B"; // 第5个字符为辅助字符,占两个代码单元
3 System.out.println(s);
4 int lengthU = s.length();
5 int lengthP = s.codePointCount(0, lengthU);
6 System.out.println(lengthU); // 6个代码单元
7 System.out.println(lengthP); // 5个代码点
8
9 }
结果为:
参考
①《Java核心技术 卷1》
② 博客:https://blog.csdn.net/sangfengcn/article/details/77073679