`

Unicode编码

 
阅读更多

转载自: http://blog.163.com/lyq_163_2009/blog/static/1340826962011687851151/

 

 

Unicode编码简介

 

Unicode(统一码、万国码、单一码、标准万国码)是计算机科学领域里的一项业界标准,用以统一地体现和处理世界上大部分的文字系统,并为其编码。

Unicode 依照通用字符集(Universal Character Set)的标准来发展,同时也以书本的形式对外发表。Unicode至今仍在不断扩增,每个新版本都加入更多新的字符。目前最新的Unicode第六版, 除了已纳入超过十万个字符(Unicode的第十万个字符在2005年获采纳,且认可成为标准之一),还包含可用作视觉参考的代码图表、编码方法、标准的 字符编码,以及记录了如大小写字母等字符特性的列表这些数据。

链接: Unicode编码    

 

--------------------------------------------------------------------------------------------------------------------------------------------------

 

Unicode编码方式

 

Unicode 的编码方式与ISO10646的通用字符集(Universal Character Set, S)概念相对应,目前实际应用的Unicode版本对应于 S-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最 多可以表示2的16次方,即65536个字符。基本满足各种语言的使用。实际上当前版本的Unicode尚未填充满这16位编码,保留了大量空间作为特殊 使用或将来扩展。

链接:  中文说明        官方说明        各种字符集的对应关系        Unicode编码表          

 

--------------------------------------------------------------------------------------------------------------------------------------------------

 

Unicode实现方式

 

Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

Unicode 的编码方式与ISO10646的通用字符集(Universal Character Set, S)概念相对应,使用16位的编码空间。它固定使用16 bits(两个字节)来表示一个字符,也就是每个字符占用2个字节,共可以表示65536个字符,基本满足各种语言的使用。

标准的Unicode称为UTF-16。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8。

UTF8是一种Unicode编码,即它的编码的字符集和Unicode是一致的,但编码的方式不一样。

字符集: 一组抽象字符的集合就是字符集(Charset)。

编码:计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。 

Unicode字符集有多种编码形式。

 

--------------------------------------------------------------------------------------------------------------------------------------------------

 

UTF-16编码

 

UTF-16由RFC2781规定,它使用两个字节来表示一个代码点。UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian方式直接保存下来。UTF-16BE和UTF-16LE不难理解,而UTF-16就需要通过在文件开头的字符来表明文件是Big Endian还是Little Endian。Big Endian为:FE FF,Little Endian为:FF FE。

代码点(Code Point)就是指Unicode中为字符分配的编号,一个字符只占一个代码点,例如我们说到字符“汉”,它的代码点是U+6C49。代码单元(Code Unit)则是针对编码方法而言,它指的是编码方法中对一个字符编码以后所占的最小存储单元。代码单元就是代码点的集合,在每种编码形式中,代码点被映射到一个或多个代码单元。UTF-16中的代码单元由 16 位组成。 

编码               字符         表示方式                         备注

UTF-16BE     ABC         0  41 0  42 0  43                     

UTF-16LE     ABC         41 0  42 0  43 0                       

UTF-16         ABC         fe ff 0  41 0  42 0 43        UTF-16  Big Endian

Unicode        ABC         ff fe 41 0  42 0  43  0       UTF-16 Little Endian

所以,Unicode编码就是 UTF-16 Little Endian,UTF-16编码就是UTF-16 Big Endian。

 

package com.nice.util;

 

public class UnicodeUtil {

 

    public static void printByte(byte[] bt){

        for(int i=0; i<bt.length; i++){

            System.out.print(Integer.toHexString(bt[i]) + " ");

        }

        System.out.println();

    }

 

    /**

     * @param args

     */

    public static void main(String[] args)throws Exception {

        String content = "ABC";

        printByte(content.getBytes("Unicode"));

        printByte(content.getBytes("UTF-16"));

        printByte(content.getBytes("UTF-16BE"));

        printByte(content.getBytes("UTF-16LE"));

    }

 

}

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------

 

增补字符

 

Unicode码空间为U+0000到U+10FFFF,一共1114112个码位,其中只有1112064个码位是合法的,有2048个码位不合法,但并不是说现在的Unicode就有这么多个字符了,实际上其中很多码位还是空闲的,到Unicode 4.0 规范为止,只有96382个码位被分配了字符。其中U+0000 到U+FFFF的部分被称为基本多语言面(Basic Multilingual Plane,BMP)。

U+10000及以上的字符称为补充字符。在Java中(Java1.5之后),补充字符使用两个char型变量来表示,这两个char型变量就组成了所谓的surrogate pair(在底层实际上是使用一个int进行表示的)。第一个char型变量的范围称为 :“高代理部分”(high-surrogates range,从uD800到uDBFF,共1024个码位), 第二个char型变量的范围称为:“低代理部分”(low-surrogates range,从uDC00到uDFFF,共1024个码位),这样使用surrogate pair可以表示的字符数一共是1048576个,加上BMP的65536个码位,去掉2048个非法的码位,正好是1112064个码位。

增补字符是Unicode标准中代码点超出 U+FFFF 的字符。

通过看它的第一个char是不是在高代理范围内,第二个char是不是在低代理范围内,就能确认是增补字符。这也意味着,高代理和低代理所占的共2048个码位(从0xD800到0xDFFF)是不能分配给其他字符的。

 

package com.nice.util;

 

public class CharUtil {

 

    /**

     * @param args

     */

    p lic static void main(String[] args) {

        // 确定表示指定字符(Unicode代码点)所需的 char 值的数量

        System.out.println(Character.charCount(0X10000));

        // 确定给出的 char 值是否为一个高代理项代码单元(也称为前导代理项代码单元)

        System.out.println(Character.isHighSurrogate((char)0Xd87e));

        // 确定给定 char 值是否一个低代理项代码单元(也称为尾部代理项代码单元)

        System.out.println(Character.isLowSurrogate((char)0Xdc1a));

        String s=String.valueOf(Character.toChars(0X2F81A));

        char[]chars=s.toCharArray();

        for(char c:chars){

            System.out.format("%x",(short)c);

        }

        // d87edc1a

        // 这个字符变成了两个char型变量,其中0xd87e就是高代理部分的值,0xdc1a就是低代理的值。

    }

 

}

 

 

执行输出内容:

2

true

true

d87edc1a

 

Java中1个char类型变量可以存储一个中文字符。对于增补字符,需要2个char来表示。

分享到:
评论

相关推荐

    最全的常用汉字Unicode码表

    1. **跨平台兼容性**:由于Unicode编码标准的普及,无论是Windows、macOS还是Linux系统,都能识别并正确显示这些编码所对应的汉字,大大增强了汉字信息的通用性和可读性。 2. **国际化支持**:随着全球化的深入发展...

    C实现数字转Unicode码

    总的来说,C语言实现数字到Unicode码的转换涉及对Unicode编码的理解、选择合适的编码方案以及可能需要的字节顺序处理。在处理Unicode时,应确保充分理解其工作原理,以便编写出正确且高效的应用程序。

    完整Unicode编码表

    Unicode编码表是一种国际标准,用于文本的编码、处理和显示,它旨在为世界上所有的字符提供一个独一无二的数字,无论它们在哪个语言中。随着Unicode 10.0版本的发布,编码表内容进一步扩充,增加了新的字符,以满足...

    各国文字Unicode编码范围

    Unicode编码是一种全球统一的字符编码标准,旨在为世界上所有语言的字符提供唯一的数字标识。它由Unicode联盟制定,包括了各种文字系统,如拉丁字母、汉字、日文、韩文、阿拉伯文等。通过Unicode编码,不同的计算机...

    通用规范汉字UNICODE码表

    标题“通用规范汉字UNICODE码表”表明本文件内容涉及了UNICODE编码体系中的通用规范汉字部分。Unicode是一个全球性的字符编码标准,它为世界上绝大部分的文字系统提供了唯一编号。UNICODE码表在计算机领域内具有...

    汉字与unicode编码(十六进制)对照表

    在这个“汉字与unicode编码(十六进制)对照表”中,我们可以找到汉字与其对应的Unicode编码,这对于编程、文本处理以及国际化和本地化工作来说具有重要的参考价值。 Unicode编码系统包括多个平面,其中基本多文种...

    Unicode中文编码对照表

    压缩包内的“unicode编码表.pdf”文件很可能是一个详细的Unicode中文编码对照表,列出了每个中文字符对应的Unicode值,这对于开发者调试代码、理解字符编码问题或者进行文本处理非常有用。这种表格通常会包括字符的...

    维吾尔文unicode编码表

    ### 维吾尔文Unicode编码表详解 #### 标题:维吾尔文Unicode编码表 **维吾尔文Unicode编码表**是针对现代维吾尔文中使用的字母、标点符号等字符制定的一种标准化编码方案。该编码表遵循Unicode国际标准,确保了...

    Fontcreate用Unicode编码下较完整的字符集分类压缩包

    标题中的“Fontcreate用Unicode编码下较完整的字符集分类压缩包”表明这是一份与字体设计软件Fontcreate相关的资源包,其中包含了使用Unicode编码的各种字符集合。Unicode是一种国际标准,旨在为全球所有语言提供一...

    文本与unicode码转换小工具V1.02.02

    文本与Unicode码转换小工具V1.02.02是一款专为处理字符编码问题而设计的...同时,理解Unicode编码的基本原理,如Unicode码点、UTF-8、UTF-16编码方式,以及它们与ASCII、GBK等编码的区别,也是IT专业人士必备的知识点。

    中文unicode编码表.rar

    Unicode编码,全称为统一码或万国码,是一种在计算机上表示文本的标准化方式,旨在解决全球不同语言字符的表示问题。中文Unicode编码表是Unicode标准的一部分,它包含了所有中文字符的编码,使得无论在哪种操作系统...

    得到字符或汉字的Unicode编码

    在“得到字符或汉字的Unicode编码”这个场景下,我们可能会使用到`wcstoul`函数,它能将宽字符串转换成无符号长整型,从而获取Unicode码点。例如,可以使用以下代码将一个汉字转换为其Unicode编码: ```c #include ...

    中英文与Unicode码互转

    《中英文与Unicode码互转》是一款非常实用的工具,主要功能是帮助用户将中文和英文字符转换成Unicode编码,反之亦然。Unicode是一种全球通用的字符编码标准,旨在为世界上所有的文字提供一个统一的表示方式,使得...

    手机号转Unicode.zip_labview_手机号码_转Unicode码

    通过以上介绍,我们可以看到,"手机号转Unicode.zip_labview_手机号码_转Unicode码"这个项目不仅涉及到LabVIEW的编程技巧,还展示了Unicode编码在实际问题解决中的应用。理解这两个概念对于提升IT技能和解决实际问题...

    IconfontTool.7z 阿里巴巴iconfont 字体库,显示图标及相应的unicode 编码。 .NET 5平台

    IconfontTool可能是专门为.NET 5平台设计的一个实用工具,它允许用户查看和管理Iconfont中的图标及其Unicode编码。这个工具可能具有以下功能: 1. **图标浏览**:提供一个图形界面,用户可以预览和搜索Iconfont库中...

    Unicode编码与汉字互转.rar

    在IT领域,Unicode编码是一种广泛使用的字符编码标准,旨在表示世界上所有语言的字符。这个压缩包文件"Unicode编码与汉字互转.rar"显然是一个关于如何在Qt C++环境中处理Unicode编码,特别是涉及到汉字转换的资源...

    Unicode编码所有汉字

    Unicode编码是一种国际标准,用于表示世界上几乎所有的文字和符号,包括汉字。它的设计目标是提供一个统一的方式来表示和处理各种语言的文字,使得信息在不同系统间可以无缝交换。Unicode覆盖了超过140,000个字符,...

    VB6.0 Unicode码 汉字 互转,支持混合互转.zip

    在VB6.0编程环境中,Unicode编码是一种标准的字符编码方式,它能够表示世界上几乎所有的文字,包括中文字符。在处理包含英文、汉字以及Unicode码的字符串时,有时我们需要进行编码之间的转换,以便正确地显示或处理...

    Unicode编码转换源码

    总之,Unicode编码转换源码是关于在不同编码体系之间进行转换的程序,涉及Unicode码点和各种编码格式如UTF-8的交互。掌握这一技术有助于实现跨平台、跨语言的信息交换,对于构建全球化软件至关重要。通过深入理解...

    维吾尔文字符集unicode编码表

    ### 维吾尔文字符集Unicode编码表 #### 概述 本文档提供了一份详细的现代维吾尔文字符集的Unicode编码表。这份表格对于理解、处理和展示维吾尔语文字具有重要意义。通过这份表格,我们可以清晰地看到每一个维吾尔文...

Global site tag (gtag.js) - Google Analytics