转载自 http://blog.csdn.net/gjb724332682/article/details/51324036

前言

Java从1.5版本开始,加入了unicode辅助平面的支持。相关的API主要在Character和String类里。增补字符是用一个长度为2的char数组表示的,分别表示高代理项和低代理项。用法可以参考如下的例子。

例一

codePointAt方法的源码如下:

public static int codePointAt(char[] a, int index) {  return codePointAtImpl(a, index, a.length);
}  

static int codePointAtImpl(char[] a, int index, int limit) {  char c1 = a[index++];  if (isHighSurrogate(c1)) {  if (index < limit) {  char c2 = a[index];  if (isLowSurrogate(c2)) {  return toCodePoint(c1, c2);  }  }  }  return c1;  }

public static int toCodePoint(char high, char low) {  return ((high - '\uD800') << 10)  + (low - '\uDC00') + 65536;  }  

如果是输入增补字符数组,那么,当传入索引是0的时候,就会返回整个增补字符的码点,当传入索引是1的时候,就会返回增补字符数组中第二个字符的码点。

public static void main(String[] args) {  char[] c = Character.toChars(Integer.parseInt("1D306", 16));//1D306是一个辅助平面字符  System.out.println(Character.codePointAt(c, 0));//输出119558,这个是1D306对应的10进制值  System.out.println(Character.codePointAt(c, 1));//输出57094,这个是c[1]对应字符的10进制值  }  

当传入的字符数组是都是基本平面的字符时,直接返回传入的索引对应的基本平面字符的码点。

public static void main(String[] args) {  char[] c = {'a', 'b', '测', '试'};  System.out.println(Character.codePointAt(c, 0));//97  System.out.println(Character.codePointAt(c, 1));//98  System.out.println(Character.codePointAt(c, 2));//27979  System.out.println(Character.codePointAt(c, 3));//35797  System.out.println((char) 97);//a  System.out.println((char) 98);//b  System.out.println((char) 27979);//测  System.out.println((char) 35797);//试  }  

例二

String类的length和codePointCount方法,在处理增补字符时,返回的数据是不一样的,而对于基本平面来说,返回值都是一样的。
length返回字符串长度,codePointCount返回代码点数量。
public static void main(String[] args) {  char[] c = Character.toChars(Integer.parseInt("1D306", 16));//1D306是一个辅助平面字符  System.out.println(Character.codePointAt(c, 0));//输出119558,这个是1D306对应的10进制值  System.out.println(Character.codePointAt(c, 1));//输出57094,这个是c[1]对应字符的10进制值  System.out.println(new String(c).codePointAt(0));//输出119558,这个是1D306对应的10进制值  System.out.println(new String(c).codePointAt(1));//输出57094,这个是c[1]对应字符的10进制值  String str = "abcdefg" + new String(c);  System.out.println(str.length());//9  System.out.println(str.codePointCount(0, str.length()));//8  }  

上面的例子,字符串长度是9,因为字符U+1D306需要一个长度为2的字符数组来表示,而实际上代码点只有1个,所以会分别返回9和8。

转载于:https://www.cnblogs.com/liujinhong/p/6498885.html

Java中unicode增补字符(辅助平面)相关用法简介相关推荐

  1. Java中的字符集编码入门Java中的增补字符

    转载自:http://jiangzhengjun.iteye.com/blog/512083 Java中的字符集编码入门Java中的增补字符 博客分类: 字符集编码 Java Java号称对Unico ...

  2. Java中的增补字符

    Java号称对Unicode提供天然的支持,这话在很久很久以前就已经是假的了(不过曾经是真的),实际上,到JDK5.0为止,Java才算刚刚跟上Unicode的脚步,开始提供对增补字符的支持. 现在的 ...

  3. Java 平台中的增补字符

    作者:Sun Microsystems, Inc. 的 Norbert Lindenberg 和 Masayoshi Okutsu 2004 年 5 月 English: Supplementary ...

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

    关于增补字符以及代码点和代码单元的介绍,请看:代码点和代码单元的理解-Java 对于char类型,因为该类型只能容纳一个内存单元,所以它无法存取辅助字符.以及当用它来读取文件中的字符时,若读到文件中的 ...

  5. JAVA中的break[标签]continue[标签]用法

    原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...

  6. java中判断一个字符在字符串中出现的次数

    源代码: //java中判断一个字符出现的次数//在下面字符串中查找有几个啊public static void testFindChar(){String str = "啊!我爱你中国!啊 ...

  7. java中Collections.sort() 排序函数的用法

    java中Collections.sort() 排序函数的用法: 用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** ...

  8. C++中容器的分类以及相关用法

    C++中容器的分类以及相关用法 C++中的容器类型及使用 容器的分类 array 数组 vector 向量 list 列表 deque队列 关联容器 迭代器 C++中的容器类型及使用 容器的概念:   ...

  9. 12 java中instanceof运算符的意义和用法

    java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...

最新文章

  1. Ubuntu系统执行shell 脚本的方法
  2. oracle安装时ins-32031,安装oracle数据库时的报错处理[INS-35172]
  3. mysql什么隔离级别最好_面试必问的 Mysql 四种隔离级别,看完吊打面试官
  4. 正确认识 Vista 激活期限
  5. python 安装包时出现红字_你好啊!Python,初次见面,多多指教
  6. MTK 驱动开发(2)---GPIO 配置
  7. 大数据、物联网、区块链:融合趋势三重奏的好处
  8. Java String startsWith()方法
  9. 微信数据解密-dat查看-免费dat转图片
  10. APQ:联合搜索网络架构、剪枝和量化
  11. 简易http服务器的实现(实现)httpserver.c
  12. switch case的天坑
  13. 鸡啄米编程入门教程代码实现
  14. Could not locate executable null\bin\winutils.exe in the Hadoop binaries
  15. 文件大小与占用空间大小(附带字节转KB,MB公式)
  16. RISC-V 和 Cortex-M 的异同
  17. UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no
  18. MES系统国内厂商排名
  19. 【组队学习】06.PyTorch的生态
  20. 北大AI公开课第一课——人工智能前沿产业趋势by雷鸣老师

热门文章

  1. Tiktok产品识别码GTIN
  2. 算法模板:动态规划之01背包【沈七】
  3. 选择了兄弟连,我不会后悔
  4. 计算机如何安装无线网络适配器,无线网络接收器怎么安装 无线网络接收器安装方法【详解】...
  5. LCD1602原理与Proteus仿真
  6. 在c语言中 寄存器变量的说明符是,c语言性能优化—使用寄存器变量
  7. win10完美去除快捷方式小箭头的方法
  8. 10-25 顺序表 23-5-11
  9. 35 岁佛系程序员,年后第一天被辞退 1
  10. 针孔相机模型和相机镜头畸变模型