首页 > 编程语言 >如何输出字符串中的增补字符?-java

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

时间:2022-11-04 19:05:47浏览次数:69  
标签:字符 codePoint java int 代码 char 字符串 增补


关于增补字符以及代码点和代码单元的介绍,请看:​​代码点和代码单元的理解-Java​​

对于char类型,因为该类型只能容纳一个内存单元,所以它无法存取辅助字符.以及当用它来读取文件中的字符时,若读到文件中的某个字符为辅助字符时,此时得到的char值并非字符串中所看到的字符,而是该字符所包含两个代码单元所分别代表的字符.

在java中,char类型用UTF-16编码描述一个代码单元. 在对UFT-16代码单元外的字符进行操作是,建议不要在程序中使用char类型.

如何输出字符串中的增补字符?-java_读取字符串


(图片来源: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代码点。


标签:字符,codePoint,java,int,代码,char,字符串,增补
From: https://blog.51cto.com/u_14233037/5824674

相关文章

  • 深入java虚拟机(二)
    加载:从class文件将二进制数据加载至内存生成Class对象.(实现由class文件从硬盘到内存迁移,注意此时还没有任何对象生成也即不存在实例变量)连接:为静态变量分配内存,初始化默认值......
  • 深入java虚拟机(一)
    packagecom.ygl;classSingleTon{privatestaticSingleTonsingleTon=newSingleTon();publicstaticintcounter1;publicstaticintcounter2=0;publicSingleTon(){......
  • javascript - 练习题:自定义typeof / 数组去重
    自定义typeof函数为啥要自定义typeof,因为 引用值 会被typeof 输出为object。 换句话说:typeof 不能区分 引用值(数组、对象和包装类)的具体类型;typeof 本身是可......
  • JavaSE—常量和变量
    常量和变量是Java程序设计的基础,用于表示存储数据。一、标识符 Java中的标识符必须以字母、下划线(_)或美元符($)开头,后面可以跟字母、数字、下划线或美元符在定义标识......
  • JavaSE—第一章练习题
    【答案】1、B   2、B     3、B   4、B    5、B    6、JavaSE;JavaEE;JavaME  7、简单性、面向对象、分布性、编译和解释性、......
  • Tomcat启动startup.bat一闪而过 - JavaWeb
    emm,首先呢,先看你的环境变量,是否​​JAVA_HOME​​这一项.后面的路径是主目录如果有这个,你的startup.bat还是一闪而过的话,那么我感觉就不是你机器的问题了,这就应......
  • Java中>>与>>>的区别
    移位时,首先搞清楚正数的原码、补码,负数的原码、补码以及在计算机中正数的二进制表示为原码还是补码?可先看这篇:​​原码,反码,补码的理解-Java​​>>与>>>都属于位运......
  • 计算二进制中1的个数-Java____[位运算思维]
    需求实现一个函数,输入一个整数,输出该数二进制表示中1的个数实现方法解析第一种:​​​Integer.toBinaryString(n)​​获得输入整数的二进制数,然后再用String类中的charA......
  • 求连续数组中唯一重复的值-Java
    1-1000中放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均只出现一次.设计一个算法,将它找出来四种方法来求解该题数组排序法先将数组排序,当相邻两个值相等时,......
  • java中\r,\n,\r\n,\n\r的区别
    java中\r,\n,\r\n,\n\r的区别文章目录​​在Java中\n,\r,\n\r,\r\n的效果​​​​java在控制台输入回车键时,是\n还是\r还是\r\n?​​​​java......