转载自 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。

 

Java中unicode增补字符(辅助平面)相关用法简介的更多相关文章

  1. JAVA中数组的基本概念与用法

    JAVA中数组的基本概念与用法 1. 数组的定义与特点 数组的一种引用数据类型 数组中可以同时存放多个数据,但是数据的类型必须统一 数组的长度在开始时就需要确定,在程序运行期间是不可改变的 虽然可以使 ...

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

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

  3. Java中Calendar(日历)相关API举例

    Java中Calendar(日历)相关API举例,实现功能:输入一个年份和月份打印出这个月的日历. package calendarPrint; import java.util.Calendar; ...

  4. Java中Unicode的编码和实现

    Unicode的编码和实现 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次. 编码方式 字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值.“A”是一个字符,“ ...

  5. 谈谈对Java中Unicode、编码的理解

    我们经常会遇到编码问题.Java号称国际化的语言,是因为它的class文件采用UTF-8,而JVM运行时使用UTF-16(至于为什么JVM中要采用UTF-16,我没看过 相关的资料,但我猜可能是因为J ...

  6. 关于Java中基本类型的长度相关基础知识

    1.  用HeapByteBuffer放int占几个byte? 占4个.而且不论你是放1还是-1还是0xffff. 因为int的长度是4个byte,HeapByteBuffer的存储又是byte数组. ...

  7. Java中常用的字符编码-解析

    ASCII字符编码 美国信息互换标准代码,为罗马字母编制的一套编码,主要用于表达现代英语和其他西欧语言中的字符,1字节的7位表示一个字符. ISO-8859-1字符编码 ISO为西欧语言中的字符制定的 ...

  8. java中字节流和字符流的区别

    流分类: 1.Java的字节流   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先.2.Java的字符流  Reader是所有读取字符串输入流的祖先,而 ...

  9. Java中的输入"scanf",Scanner用法

    1.输入程序 1)Scnner的初始用法: 1 import java.util.Scanner; 2 public class Textone { 3 public static void main ...

随机推荐

  1. PAT 1121 Damn Single[简单]

    1121 Damn Single (25 分) "Damn Single (单身狗)" is the Chinese nickname for someone who is bei ...

  2. TensorFlow学习笔记(五)图像数据处理

    目录: 一.TFRecord输入数据格式 1.1 TFrecord格式介绍 1.2 TFRecord样例程序 二.图像数据处理 2.1TensorFlow图像处理函数 2.2图像预处理完整样例 三.多 ...

  3. 关于softnet的加密硬件狗 也就是所谓的赛孚耐

    SuperDog-R-2.2.1.iso 上面那个文件就是光盘里面的东西.你买了他们的产品 自然后带着这个玩意. 按照默认路径安装一下. 安装完毕如下图:

  4. python16_day22【cmdb注释】

    https://github.com/willianflasky/growup/tree/master/s16/day23/learnMadKing

  5. PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))

    题目大意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点 ...

  6. java环境变量及Eclipse自动编译问题

    环境变量,是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路 ...

  7. hu3613 Best Reward

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目: Best Reward Time Limit: 2000/1000 MS (Java/Oth ...

  8. java中hashSet原理

    转自: http://blog.csdn.net/guoweimelon/article/details/50804799 HashSet是JavaMap类型的集合类中最常使用的,本文基于Java1. ...

  9. C/C++:函数的编译方式与调用约定以及extern “C”的使用

    转自:https://www.cnblogs.com/qinfengxiaoyue/archive/2013/02/04/2891908.html 函数在C++编译方式与C编译方式下的主要不同在于:由 ...

  10. [one day one question] Iscroll 5.0 在chrome上无法滑动

    问题描述: Iscroll 5.0 在chrome上无法滑动,不仅仅在chromePC的开发的时候,在手机上的chrome也有同样的问题,这怎么破? 解决方案: // 关闭 PointerEvent ...