现在的位置: 首页 > 综合 > 正文

Unicode与UTF-8

2013年08月31日 ⁄ 综合 ⁄ 共 1495字 ⁄ 字号 评论关闭

一,ASCII

一个字节有8位,可表示的范围0~256,每一个数即是一个状态,对应一个英语中一个字符。例如a A 空格等。这样的英语字符总共有128个。

但是如果将各国语言符号包含进来,一个字节远不能囊括所有字符,故而出现了Uinicode集,包含了目前计算机使用的所有字符。

Unicode字符集都由2个字节组成,但是一些不常用的语言的字符不支持。

但是Unicode有个缺陷,对于只需一个字节便可表示的ASCII英文字符集,剩余的空间被浪费了:

UTF-8的编码规则很简单, 只有两条:

1) 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于
英语字母, UTF-8编码和ASCII码是相同的.

2) 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前
两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码.

下表总结了编码规则, 字母x表示可用编码的位.

<SPAN xmlns="http://www.w3.org/1999/xhtml">// #txt---
   |  Unicode符号范围      |  UTF-8编码方式
 n |  (十六进制)           | (二进制)
---+-----------------------+------------------------------------------------------
 1 | 0000 0000 - 0000 007F |                                              0xxxxxxx
 2 | 0000 0080 - 0000 07FF |                                     110xxxxx 10xxxxxx
 3 | 0000 0800 - 0000 FFFF |                            1110xxxx 10xxxxxx 10xxxxxx
 4 | 0001 0000 - 0010 FFFF |                   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 5 | 0020 0000 - 03FF FFFF |          111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

                    表 1. UTF-8的编码规则
// #txt---end
</SPAN>

下面, 还是以汉字""为例, 演示如何实现UTF-8编码.

已知""的unicode是4E25(1001110 00100101), 根据上表, 可以发现4E25处在第三行的
范围内(0000 0800 - 0000 FFFF), 因此""的UTF-8编码需要三个字节, 即格式是
"1110xxxx 10xxxxxx 10xxxxxx". 然后, 从""的最后一个二进制位开始, 依次从后向前
填入格式中的x, 多出的位补0. 这样就得到了, ""的UTF-8编码是 "11100100 10111000
10100101", 转换成十六进制就是E4B8A5.

Unicode码可以采用UCS-2格式直接存储,Unicode规范中定义, 每一个文件的最前面分别加入一个表示编码顺序的字符, 这个字符
的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE), 用FEFF表示. 这正好是
两个字节, 而且FF比FE大1.
以汉字""为例, Unicode码
是4E25, 需要用两个字节存储, 一个字节是4E, 另一个字节是25. 存储的时候, 4E在前,
25在后, 就是Big endian方式; 25在前, 4E在后, 就是Little endian方式.
// Big Endian(4E25) Little Endian(254E)

此博客参考于http://blog.csdn.net/tge7618291/article/details/7599902

抱歉!评论已关闭.