摘要

  • ​​1.概念​​
  • ​​2.获取方法​​
  • ​​3.代码点与代码单元的代码示例​​

1.概念

代码点(code point):与一个编码表中的某个字符对应的代码值.

在Unicode标准中,代码点采用十六进制书写,并加上前缀U+,​​例U+0041就是字母A的代码点.​

Unicode的代码点可以分成17个代码级别(code plane).
第一个代码级别成为基本的多语言级别,代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码.
其余的16个附加级别,代码点从U+10000到U+10FFFF,其中包括了一些辅助字符(增补字符).
​增补字符是用一个长度为2的char数组表示的,分别表示高代理项和低代理项。​​ 关于增补字符的具体描述请看:关于Java增补字符

代码单元(code unit):在第一代码级别中,每个字符用16位表示(即代码单元);而辅助字符采用一对连续的代码单元进行编码.

UTF-16编码采用不同长度的编码表示所有的Unicode代码点.

通俗理解 :
代码点 : Unicode中的各个字符
代码单元 : 若一个字符的代码长度为16位,则为一个代码单元;若一个字符的代码长度有两个16的代码长度编码,则该字符有两个代码单元.

Unicode(代码点)

常用字符

辅助字符

数量(代码单元)

一个代码单元

一对代码单元

代码点和代码单元的理解-Java_ico


(图片来源:​​char 码点和代码单元​​)

在Java中一个Unicode占2个字节(byte)
一个字节等于8比特位(bit)
因此,每个Unicode码占用16个比特位

2.获取方法

String.length()方法 :
​​​返回采用UTF-16编码表示的给定字符串所需要的代码单元数量.​​​ String.codePointCount(int beginIndex, int endIndex) :
​返回此String指定文本范围内的Unicode代码点数.​​ String.charAt(int index) :
​返回位置index的代码单元,n介于0~String.length()-1之间.​

3.代码点与代码单元的代码示例

从​​Unicode字符百科​​里面找到U+10000以后的一个字符进行试验.

public class CodePointDemo {
public static void main(String[] args) {
String str = "?";
System.out.println(str.length());// 输出该字符串的代码单元的数量
System.out.println(str.codePointCount(0, str.length()));// 输出该字符串的代码点数
System.out.println(Integer.toHexString(str.charAt(0)));// 先获得该字符第一个位置的代码单元的char类型字符,编译器先将char类型强转为int类型的值,后将int值转换为16进制数进行输出
System.out.println(Integer.toHexString(str.charAt(1)));//
System.out.println("\ud801\udcd1");// 将两个char类型字符输出组成了一个代码点?
}
}
/*输出:
2
1
d801
dcd1
?
*/

​Integer.toHexString(str.charAt(0))​​​需要注意,该代码用到了强转
关于强转的详细信息,请看:
首先,str.charAt(0)返回一个char类型字符,Integer.toHexString(int i)接受一个int类型的值,故需要先将char强转为int,在完成该代码.

public class StrongTurnDemo { public static void main(String[] args) { String str = "?"; int i = str.charAt(0); System.out.println(i); System.out.println(Integer.toHexString(i)); } } /*输出 : 55297 d801 */

对于char类型来说,charAt(int index)只能获取BMP的字符,对于增补字符,是无法正常获得的.所以当字符串中包含增补字符又该如何获取呢,当文档当中有增补字符呢?请看:​​如何读取字符串(包含增补字符)?-java​​