`
lxz891117
  • 浏览: 33255 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

 
阅读更多

前言

Java从1.5版本开始,加入了unicode辅助平面的支持。本文在JDK1.6上测试。

相关的API主要在Character和String类里。以下这段话是Character的文档说明摘抄。

==================================================================================================

Character 类在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然。字符信息基于 Unicode 标准,版本 4.0。Character 类的方法和数据是通过 UnicodeData 文件中的信息定义的,该文件是 Unicode Consortium 维护的 Unicode Character Database 的一部分。此文件指定了各种属性,其中包括每个已定义 Unicode 代码点或字符范围的名称和常规类别。此文件及其描述可从 Unicode Consortium 获得,网址如下:http://www.unicode.org 。char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体。Unicode 标准曾做过修改,以允许那些其表示形式需要超过 16 位的字符。合法代码点 的范围现在是从 U+0000 到 U+10FFFF,即通常所说的 Unicode 标量值。(请参阅 Unicode 标准中 U+n 表示法的定义。)从 U+0000 到 U+FFFF 的字符集有时也称为 Basic Multilingual Plane (BMP)。代码点大于 U+FFFF 的字符称为增补字符。Java 2 平台在 char 数组以及 String 和 StringBuffer 类中使用 UTF-16 表示形式。在这种表现形式中,增补字符表示为一对 char 值,第一个值取自高代理项 范围,即 (\uD800-\uDBFF),第二个值取自低代理项 范围,即 (\uDC00-\uDFFF)。所以,char 值表示 Basic Multilingual Plane (BMP) 代码点,其中包括代理项代码点,或 UTF-16 编码的代码单元。int 值表示所有 Unicode 代码点,包括增补代码点。int 的 21 个低位(最低有效位)用于表示 Unicode 代码点,并且 11 个高位(最高有效位)必须为零。除非另有指定,否则与增补字符和代理项 char 值有关的行为如下:只接受一个 char 值的方法无法支持增补字符。它们将代理项字符范围内的 char 值视为未定义字符。例如,Character.isLetter('\uD840') 返回false,即使是特定值,如果在字符串的后面跟着任何低代理项值,那么它将表示一个字母。接受一个 int 值的方法支持所有 Unicode 字符,其中包括增补字符。例如,Character.isLetter(0x2F81A) 返回 true,因为代码点值表示一个字母(一个 CJK 象形文字)。在 Java SE API 文档中,Unicode 代码点 用于范围在 U+0000 与 U+10FFFF 之间的字符值,而 Unicode 代码点 用于作为 UTF-16 编码的代码单元的 16 位 char 值。有关 Unicode 技术的详细信息,请参阅 Unicode Glossary。

====================================================================================================

可以看出,增补字符是用一个长度为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特殊字符.rar

    Java显示Unicode特殊字符, protected char base; // 指定我们显示的初始值7  protected Font font = new Font("serif", Font.PLAIN, 18); // 指定缺省的显示字体  protected Font headingfont = new Font(...

    Java中的字符集编码入门(六)Java中的增补字符.doc

    ### Java中的字符集编码入门(六):Java中的增补字符 ...通过对 Java 中增补字符的支持机制的理解,我们可以更加高效地处理各种语言环境下的文本数据,并且能够在开发过程中避免常见的陷阱和误区。

    Java Unicode 和字符集

    ### Java中的Unicode与字符集详解 #### 一、引言 在软件开发过程中,正确处理文本数据至关重要。尤其是在全球化日益加深的今天,软件不仅要能够处理英语等常见的西方语言,还要支持世界各地的语言,包括中文、日文...

    java 中文Unicode转换

    本文将深入探讨如何在Java中进行中文字符到Unicode编码的转换,以及如何从Unicode编码还原为中文字符。 首先,我们来了解Unicode的基本概念。Unicode是一个国际标准,它为每个字符分配了一个唯一的数字,这个数字被...

    java实现十六进制字符unicode与中英文转换示例

    总结,这个示例展示了如何在Java中处理Unicode和十六进制字符串的转换,强调了理解字符编码格式和处理过程的重要性。在实际开发中,正确处理字符编码可以避免乱码问题,确保数据的准确性和一致性。同时,开发者应该...

    JAVA反编译和unicode转字符.rar

    标题“JAVA反编译和unicode转字符.rar”表明这个压缩包包含了一套Java反编译工具Jad.exe和相关的使用手册,以及一个用于将反编译后汉字Unicode格式转换为可读字符格式的代码。Jad是Java反编译器的代表之一,它能够将...

    常用的java汉字unicode编码

    在Java中处理Unicode文本时,可以使用多种方法: 1. **Unicode转义序列**:Java字符串可以直接包含Unicode转义序列,如`\u7684`代表的是“的”字。这种形式在源代码中表示Unicode字符非常方便。 2. **Character类...

    Unicode和字符串

    在Java中,字符串是不可变的,通过`String`类来表示,也可以使用`StringBuilder`或`StringBuffer`进行字符串操作。 处理Unicode字符串时,需要注意编码和解码的过程。编码是将字符转换为字节序列,解码则相反,将...

    java 字符串中文判断

    本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要理解Java中的字符类型`char`。在Java中,一个`char`类型的变量可以存储一个Unicode字符,...

    JAVA中汉字字符转化为英文字符

    ### JAVA中汉字字符转化为英文字符 #### 知识点概览 本文将详细介绍如何在Java中实现汉字到英文字符的转换。此技术主要用于提取汉字的首字母或进行其他基于字符编码的操作。通过以下两个核心方法:`toTureAsciiStr`...

    Unicode转字符串软件

    Unicode转字符串软件是一种工具,主要用于将Unicode编码转换为可读的字符串形式,这对于在使用SIM800 Series AT命令进行硬件控制时处理文本数据尤为重要。SIM800 Series是一款广泛应用于GSM/GPRS通信模块的设备,它...

    通过对字符的unicode编码进行判断来确定字符是否为中文

    ### 通过对字符的Unicode编码进行判断来确定字符是否为中文 在计算机编程中,经常需要对文本中的字符进行处理和判断...总之,通过Unicode编码判断字符是否为中文字符的方法简单而有效,可以在各种应用程序中广泛使用。

    Unicode 5.1 字符编码分解表

    **Unicode 5.1 字符编码分解表** Unicode 是一种国际标准,用于在各种计算机系统中表示文本,尤其是网络上的文本。它旨在涵盖世界上几乎所有的书面语言,包括拉丁文、希伯来文、汉字、阿拉伯文等。Unicode 5.1 是 ...

    Unicode字符编码表

    Unicode的目的是统一各种不同编码系统中的字符,使得任何一个字符都可以用一个唯一的代码点(code point)来表示。Unicode字符编码表包括了众多脚本和语言的字符,如拉丁文、中文、希腊文、西里尔字母、希伯来文、...

    unicode 汉字字符集

    ### Unicode汉字字符集详解 #### 一、Unicode简介 Unicode是一种国际编码标准,旨在为所有书写语言中的每个字符提供唯一的数字。它不仅包括了西文字符,还包含了各种语言文字,如汉字、日文、韩文等。Unicode的...

    电子教材:《Java语言程序设计-统一代码(Unicode)字符集》pdf版

    当在Java中创建或操作字符串时,可以直接使用Unicode码点来构建字符。例如,可以通过`String.valueOf((char)码点)`的方式生成单个字符,或者使用`new String(byte[], charsetName)`构造方法从字节流中解析字符串,...

    Unicode码字符转换器

    它使用16位的编码空间,理论上可以表示65536个不同的字符,但实际应用中,Unicode还采用了扩展机制,如UTF-8、UTF-16等编码格式,以支持更多字符。UTF-8是一种变长编码,它根据字符的不同,占用1到4个字节,而UTF-16...

    中文字符Unicode字符转换

    运行环境Java JDK 5.0 Unicode字符转换为中文字符,中文字符转Unicode字符 Unicode字符只支持以\u####格式 &lt;br&gt;MS有人在找这东西,自己也找过,没找着就自己做了一个,功能简单只满足自己的需求:) pp

    中文转化为unicode格式的方法类

    同时,类可能还会有其他辅助方法,用于处理更复杂的 Unicode 相关操作,比如处理代理对(用于表示超出基本多文种平面的字符)。 总结来说,将中文转化为 Unicode 格式是通过理解 Unicode 编码原理,利用 Java 提供...

    Java实现中文字符串与unicode互转工具类

    "Java实现中文字符串与unicode互转工具类" Java实现中文字符串与unicode互转工具类是指使用Java语言实现中文字符串与unicode码之间的相互转换。这个工具类主要用于解决中文字符串与unicode码之间的转换问题,提供了...

Global site tag (gtag.js) - Google Analytics