关于增补字符以及代码点和代码单元的介绍,请看:代码点和代码单元的理解-Java
对于char类型,因为该类型只能容纳一个内存单元,所以它无法存取辅助字符.以及当用它来读取文件中的字符时,若读到文件中的某个字符为辅助字符时,此时得到的char值并非字符串中所看到的字符,而是该字符所包含两个代码单元所分别代表的字符.
在java中,char类型用UTF-16编码描述一个代码单元. 在对UFT-16代码单元外的字符进行操作是,建议不要在程序中使用char类型.(图片来源:java核心技术卷1(第九版))
对于图片所示,对于辅助字符而言,一个字符可以用两个char类型的值表示.图中的例子,charAt()方法无法正常获取到自己想要的字符.
public class CodePointDemo2 {
public static void main(String[] args) {
String str = " ? is a 增补字符";
for (int i = 0; i <= str.codePointCount(0, str.length());) {
int cp = str.codePointAt(i);// 获得该字符串索引位置的代码点值
if (Character.isSupplementaryCodePoint(cp)) {
System.out.print(Character.toChars(cp));
i += 2;
} else {
System.out.print(Character.toChars(cp));
i++;
}
}
}
}
程序开始i=0,读取空格cp的值为32,if判断空格后,不是增补字符,则进行toChars后将有效的Unicode代码点32输出为" “,之后i+1;
当i = 1时,开始读取增补字符.此时cp的值为该增补字符的代码点的值即66769.if判断cp的值为增补字符,后进行toChars后将有效的Unicode代码点32输出为"?”,之后i+2.
方法介绍
- String类中的codePointAt(int index)
- Character.isSupplementaryCodePoint(int codePoint)
- java.lang.Character.toChars(int codePoint)
String类中的codePointAt(int index)
若index所指的为BMP(基本多文种平面或平面0)的索引,则直接返回该代码点值,
否则,当index所指的为增补字符的索引:
1.索引指定的char值属于高代理项范围,则返回该增补字符的代码点值.
2.索引指定的char值属于低代理项范围,则返回该增补字符的低代理项的代码点值.
public class CodePointDemo2 {
public static void main(String[] args) {
String str = " ?";
System.out.println(str.codePointAt(0));
System.out.println(str.codePointAt(1));
System.out.println(str.codePointAt(2));
}
}
/*输出:
32
66769
56529
*/
输出结果分析:
32为空格的十进制数;
66769为?的十进制数;
56529为?的低代理项的代码点的十进制数.
Character.isSupplementaryCodePoint(int codePoint)
public static boolean isSupplementaryCodePoint(int codePoint)确定指定字符(Unicode 代码点)是否在增补字符范围内。
该方法调用以下表达式:
codePoint >= 0x10000 && codePoint <= 0x10FFFF
参数:
codePoint - 要测试的字符(Unicode 代码点)
返回:
如果指定字符在 Unicode 增补字符范围内,则返回 true;否则返回 false。
java.lang.Character.toChars(int codePoint)
指定字符(Unicode代码点)存储在一个UTF-16表示形式转换的字符数组。
如果指定的代码点为BMP(基本多文种平面或平面0)的值,由此产生的char数组具有相同的值码点。
如果指定的代码点是一个增补代码点,由此产生的char数组具有相应的代理对。
(原文链接:java.lang.Character.toChars()方法实例)
以下是java.lang.Character.toChars()方法的声明:
public static char[] toChars(int codePoint)
参数:
codePoint - 一个Unicode代码点
返回值:
此方法返回其代码点UTF-16表示一个字符数组。
异常:
IllegalArgumentException - 如果指定的代码点不是一个有效的Unicode代码点。