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

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(代码点)常用字符辅助字符
数量(代码单元)一个代码单元一对代码单元

在这里插入图片描述
(图片来源: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

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页