如何输出字符串中的增补字符?-java

关于增补字符以及代码点和代码单元的介绍,请看:代码点和代码单元的理解-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)

若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代码点。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值