Unicode编码

ASCII
(American Standard Code for Information Interchange "美国信息交换标准码")
1. 7 bits表示一个字符, 共128个字符
2、第一个bit总是0,用1 byte(7bit)表示字符
3、IBM扩展,共256字符,第一个bit为1时表示扩展的字符


字符标准组织
Unicode  —— Unicode
ISO      —— UCS(Universal Character Set)
UCS(ISO制定的标准), 和Unicode是完全一样的,仅名字不同。


Unicode涉及两个步骤
1、定义一个规范,给所有字符指定唯一对应的数字,这完全是数学问题,跟计算机无关。
2、怎么把字符对应的数字保存在计算机中,这就涉及到实际在计算机中占多少字节空间。




Unicode 版本1
—— 两个字节(16bit)来表示所有字符
     1. 其中0至127表示ASCII字符。2^16=65536 剩余字符表示汉字等。
     2. 怎么把0至65535这些数字转化成01串保存到计算机中. 即UTF(Unicode transformation format),有UTF-8,UTF-16.


UTF-16 —— 即Unicode 16,UCS-2; 始终用两个字节(16bit)来表示所有字符。
            优点:中文较多时比较节省空间;
                  程序始终按两个字节(16bit)来解析,简单;
                  容错能力强,即使某个字节传输错误,也只影响1个字符(2bytes)。 


UTF-8  —— 变长编码,Unicode版本,只能1-2-3个字节来表示所有字符。
            优点:英文较多时比较节省空间;
                  
 
用UTF-16表示"汉"
01101100 01001001(共16 bit,两个字节)


用UTF-8表示"汉"  (程序需要一个字节一个字节地读取)
一字节:0xxxxxxx, 以0开头,XX代表任意bit,跟ASCII一样。
两字节:110xxxxx 10xxxxxx,两字节为一单元,可表示2^11=2048 个字符
三字节:1110xxxx 10xxxxxx 10xxxxxx 三字节为一单元,可表示2^16=65536 个字符
"汉"的编码27721大于2048,只能用三个字节来表示。
只需把27721=110110001001001 依次放入三字节xxx中即可 (Big-Endian从左到右放,Little-Endian从右到左放)




Unicode 版本2
—— 65536字符数不够多,需要更多字符扩展
UTF16(UCS-2)  只能2字节、4字节
UTF32(UCS-4)  所有字符都用4字节表示
UTF-8         可变长,任意1-8个字节




文本开头标志 —— 决定编码方式
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.




参考资料:http://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html






   采用UTF-16(UCS-2) 2字节定长编码
    Unicode (UTF-16) UCS-2    Java String转换
       try {
byte[] arr = {0x51, 0x3f};
            String content = new String(arr, "UnicodeBigUnmarked");
            System.out.println(content);   // 儿
            byte[] arr1 = {0x00,  0x61};
            content = new String(arr1, "UnicodeBigUnmarked");
            System.out.println(content);   //  a
        } catch (UnsupportedEncodingException e) {
            // TODO: handle exception
        }

你可能感兴趣的:(编码,Unicode,ASCII,UTF8)