網上找的關於utf-8概念.地址:http://www.utf.com.cn/article/s41-3
什麼是 UTF-8?
首先 UCS 和 Unicode 只是分配整數給字元的編碼錶. 現在存在好幾種將一串字元表示為一串位元組的方法. 最顯而易見的兩種方法是將 Unicode 文本儲存為 2 個 或 4 個位元組序列的串. 這兩種方法的正式名稱分別為 UCS-2 和 UCS-4. 除非另外指定, 否則大多數的位元組都是這樣的(Bigendian convention). 將一個 ASCII 或 Latin-1 的檔案轉換成 UCS-2 只需簡單地在每個 ASCII 位元組前插入 0x00. 如果要轉換成 UCS-4, 則必須在每個 ASCII 位元組前插入三個 0x00.
在 Unix 下使用 UCS-2 (或 UCS-4) 會導致非常嚴重的問題. 用這些編碼的字串會包含一些特殊的字元, 比如 ’/0’ 或 ’/’, 它們在 檔案名稱和其他 C 庫函數參數裡都有特別的含義. 另外, 大多數使用 ASCII 檔案的 UNIX 下的工具, 如果不進行重大修改是無法讀取 16 位的字元的. 基於這些原因, 在檔案名稱, 文字檔, 環境變數等地方, UCS-2 不適合作為 Unicode 的外部編碼.
在 ISO 10646-1 Annex R 和 RFC 2279 裡定義的 UTF-8 編碼沒有這些問題. 它是在 Unix 風格的作業系統下使用 Unicode 的明顯的方法.
UTF-8 有一下特性:
UCS 字元 U+0000 到 U+007F (ASCII) 被編碼為位元組 0x00 到 0x7F (ASCII 相容). 這意味著只包含 7 位 ASCII 字元的檔案在 ASCII 和 UTF-8 兩種編碼方式下是一樣的.
所有 >U+007F 的 UCS 字元被編碼為一個多個位元組的串, 每個位元組都有標記位集. 因此, ASCII 位元組 (0x00-0x7F) 不可能作為任何其他字元的一部分.表示非 ASCII 字元的多位元組串的第一個位元組總是在 0xC0 到 0xFD 的範圍裡, 並指出這個字元包含多少個位元組. 多位元組串的其餘位元組都在 0x80 到 0xBF 範圍裡. 這使得重新同步非常容易, 並使編碼無國界, 且很少受丟失位元組的影響.
可以編入所有可能的 231個 UCS 代碼UTF-8 編碼字元理論上可以最多到 6 個位元組長, 然而 16 位 BMP 字元最多隻用到 3 位元組長.
Bigendian UCS-4 位元組串的排列順序是預定的.位元組 0xFE 和 0xFF 在 UTF-8 編碼中從未用到.
下列位元組串用來表示一個字元. 用到哪個串取決於該字元在 Unicode 中的序號.
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx 的位置由字元編碼數的二進位表示的位填入. 越靠右的 x 具有越少的特殊意義. 只用最短的那個足夠表達一個字元編碼數的多位元組串. 注意在多位元組串中, 第一個位元組的開頭"1"的數目就是整個串中位元組的數目.
例如: Unicode 字元 U+00A9 = 1010 1001 (著作權符號) 在 UTF-8 裡的編碼為:
11000010 10101001 = 0xC2 0xA9
而字元 U+2260 = 0010 0010 0110 0000 (不等於) 編碼為:
11100010 10001001 10100000 = 0xE2 0x89 0xA0
這種編碼的官方名字拼字為 UTF-8, 其中 UTF 代表 UCS Transformation Format. 請勿在任何文檔中用其他名字 (比如 utf8 或 UTF_8) 來表示 UTF-8, 當然除非你指的是一個變數名而不是這種編碼本身.
linux下驗證:
main()<br />{<br /> char *p="中";<br /> int i;</p><p> for(i=0;i<strlen(p);i++)<br /> printf("%02x/n",p[i]&0xFF);<br />}<br />
編輯完,源碼儲存成utf-8的,然後gcc編譯
運行輸出:
e4
b8
ad
“中"用了3個位元組,二進位碼分別為:
e4:11100100
b8:10111000
ad:10101101
與U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 相符
11100100 10111000 10101101
另外用gcc產生彙編,發現gcc產生的是
.string "/344/270/255"
這個是把每個數字轉換成二進位就對應了
3:11 4:100 4:100 2:10 7:111 0:000 2:10 5: 101 5:101