Unicode與UTF-8

一,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

發佈了59 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章