Unicode 转~!!!!!

Unicode编码

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来表示。

时间: 2024-10-05 15:40:29

Unicode 转~!!!!!的相关文章

js_字符转Unicode

在开发中总会遇到关于Unicode的转码和解码,每次都找工具转/解码很麻烦 ,今天在网上get到一个简单的转/解Unicode的函数. var UnicodeFun = { toUnicode: function(str) { if(str == '') return 'value is null'; return escape(str).toLocaleLowerCase().replace(/%u/gi, '\\u');; }, UnicodeDecode: function(str){ i

【推介】TMS的控件之“TMS Unicode Component Pack”和“TMS Advanced Toolbars &amp; Menus”

TMS Unicode Component Pack是一款支持多语言的界面控件包,提供超过60种控件来为你的Delphi和C++Builder应用程序添加Unicode支持. 介绍: TMS Unicode Component Pack控制组件能让你在不终止Delphi.C++Builder或Windows 95/98/ME的情况下利用Windows NT/2000/XP/2003/Vista的Unicode功能开发应用程序.  注意:这些控制组件不会将Unicode功能添加到Windows 9

PHP实现Unicode和Utf-8互相转换

  一. 编码原理及实现 unicode编码是实现utf-8与gb系列编码(gb2312.gbk.gb18030)转换的基础,虽然我们也可以直接做一个utf-8到这些编码 的对照表,但很少有人会这么做,因为utf-8的可变编码具有不确定性,因此一般情况使用都是unicode与gb编码的对照 表,unicode(UCS-2)实际上是utf-8的基础编码,utf-8只是它的一种实现而已,两者存在下面的对应关系: Unicode符号范围           | UTF-8编码方式 u0000 0000

解决 iOS NSDictionary 输出中文字符”乱码”(Unicode编码)问题

简单定义一个字典,输出结果: NSDictionary *dic = @{ @"我是中文字符": @"223333", @"aaa": @{ @"aaa": @"啦啦啦" } }; NSLog(@"%@", dic); 将会看到这样的"乱码",这种现象经常在调试服务端返回 JSON 结果的时候遇到: 2015-02-25 19:23:40.346 XXXX[13273

VC中使用CFile正确的追加写中文数据到文件不出现乱码-unicode字符集

CFile saveFile; CString file_name = getFileName(); BOOL isOpenOK = saveFile.Open(file_name, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate, NULL); if (false == isOpenOK) { MessageBox(L"文件打开失败!"); return; } //是文件保存为unicode格式 //为了uni

简单聊下Unicode和UTF-8

今晚听同事分享提到这个,简单总结下. ## Unicode字符集 Unicode的出现是因为ASCII等其他编码码不够用了,比如ASCII是英语为母语的人发明的,只要一个字节8位就能够表示26个英文字母了,但是当跨区域进行信息交流的时候,尤其是Internet的出现,除了“A”,“B”,“C",还有“你”,“我”,“他”需要表示,一个字节8位显然不够用,够因此Unicode就被发明出来,Unicode的最大码位0x10FFFF,有21位.中文对应的Unicode编码见http://www.chi

使用 Unicode 编码

面向公共语言运行库的应用程序使用编码将字符表示形式从本机字符方案(Unicode)映射为其他方案.应用程序使用解码将字符从非本机方案(非 Unicode)映射为本机方案.System.Text 命名空间提供了使您能够对字符进行编码和解码的类.System.Text 编码支持包括以下编码: Unicode UTF-32 编码 Unicode UTF-32 编码将 Unicode 字符表示为 32 位整数序列.您可以使用 UTF32Encoding 类在字符和 UTF-32 编码之间相互转换. Un

C++ Unicode SBCS 函数对照表

来源:http://www.cnblogs.com/PiaoDbg/archive/2012/03/04/2379336.html Generic SBCS UNICODE TCHAR char wchar_t _TEOF EOF WEOF _TINT int wint_t _TSCHAR signed char wchar_t _TUCHAR unsigned char wchar_t _TXCHAR char wchar_t _T(x) x L __targv __argv __wargv

字符编码笔记:ASCII,Unicode和UTF-8【转载】

最近买了部安卓的手机,google nexus5 系统是安卓4.4.2. 刚到手就发现链接wifi有问题,一直在获取ip(obtaining ip...)和验证.试过恢复出厂 重启 各种都不管用,只有设置静态ip才可以,但是不能一直这样子呀!! 查了下路由器,路由器已经分配了地址.所以最大可能就是安卓手机上拿到这个地址没有成功写入配置文件,为什么没有写入呢,就是权限的问题了,不明白为什么google会出现这个错误. 因为不熟悉安卓系统,所以查了好几天,终于在一个外国网站上发现了下面这个解决办法,

PyQt QString 与 Python str&amp;unicode

昨日,将许久以前做的模拟网页登录脚本用PyQt封装了一下,结果出大问题了, 登录无数次都提示登录失败!!而不用PyQt实现的GUI登录直接脚本登录无数次都提示登录成功!!心中甚是伤痛,于是探究起来,解决这一问题. 问题描述及证据如下: 上图是脚本MD5加密过程及结果 上图是PyQt GUI中获取密码框内容后加密的结果,其实现代码如下: # -*- coding: gbk -*- ''' Version : Python27 Author : Spring God Date : 2013-6-28