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