(搬運工)ASCII 、GB2312、GBK、GB18030、unicode、UTF-8字符集編碼詳解
Posted on 2011-05-27 16:36 點點滴滴 閱讀(761) 評論(0) 編輯 收藏 引用 所屬分類: 02 編程語言ASCII字符集編碼
ASCII碼是7位編碼,字符在計算機中以其ASCII碼方式表示,其長度為1個字節, 有符號字符型數。編碼范圍是0x00-0x7F(0~127)。ASCII字符集包括英文字母、阿拉伯數字和標點符號等字符。其中0x00-0x20和0x7F共33個控制字符。
ASCII 十六進制 控制字 代碼含義
00 00 NUL 空
01 01 SOH 標題開始
02 02 STX 正文開始
03 03 ETX 正文結束
04 04 EOT 傳輸結否
05 05 ENQ 詢問
06 06 ACK 確認
07 07 BEL 響鈴
08 08 BS 退格
09 09 HT 橫向列表
10 0A LF 換行
11 0B VT 縱向列表
12 0C FF 換頁
13 0D CR 回車
14 0E SO 換檔(Shift-Out)
15 0F SI 換檔(Shift-In)
16 10 DLE 數據鏈擴展
17 11 DC1 設備控制1
18 12 DC2 設備控制2
19 13 DC3 設備控制3
20 14 DC4 設備控制4
21 15 NAK 不確認
22 16 SYN 同步字符
23 17 ETB 傳輸塊結否
24 18 CAN 作廢
25 19 EM 介質結束
26 1A SUB 置換
27 1B ESC 擴展
28 1C FS 文件分隔符
29 1D GS 組分隔符
30 1E RS 記錄分隔符
31 1F US 單位分隔符
ASCII碼對照表
ASCII碼 鍵盤 ASCII 碼 鍵盤 ASCII 碼 鍵盤 ASCII 碼 鍵盤
27 ESC 32 SPACE 33 ! 34 "
35 # 36 $ 37 % 38 &
39 ' 40 ( 41 ) 42 *
43 + 44 ' 45 - 46 .
47 / 48 0 49 1 50 2
51 3 52 4 53 5 54 6
55 7 56 8 57 9 58 :
59 ; 60 < 61 = 62 >
63 ? 64 @ 65 A 66 B
67 C 68 D 69 E 70 F
71 G 72 H 73 I 74 J
75 K 76 L 77 M 78 N
79 O 80 P 81 Q 82 R
83 S 84 T 85 U 86 V
87 W 88 X 89 Y 90 Z
91 [ 92 \ 93 ] 94 ^
95 _ 96 ` 97 a 98 b
99 c 100 d 101 e 102 f
103 g 104 h 105 i 106 j
107 k 108 l 109 m 110 n
111 o 112 p 113 q 114 r
115 s 116 t 117 u 118 v
119 w 120 x 121 y 122 z
123 { 124 | 125 } 126 ~
只支持ASCII碼的系統會忽略每個字節的最高位,只認為低7位是有效位。HZ字符編碼就是早期為了在只支持7位ASCII系統中傳輸中文而設計的編碼。早期很多郵件系統也只支持ASCII編碼,為了傳輸中文郵件必須使用BASE64或者其他編碼方式。
GB2312字符集編碼
GB2312 是漢字字符集和編碼的代號,中文全稱為“信息交換用漢字編碼字符集”,由中華人民共和國國家標準總局發布,一九八一年五月一日實施。GB 是“國標” 二字的漢語拼音縮寫。
GB2312 字符集 (character set) 只收錄簡化字漢字,以及一般常用字母和符號,主要通行于中國大陸地區和新加坡等地。GB2312 共收錄有 7445 個字符,其中簡化漢字 6763 個,字母和符號 682 個。
GB2312 將所收錄的字符分為 94 個區,編號為 01 區至 94 區;每個區收錄 94 個字符,編號為 01 位至 94 位。GB2312 的每一個字符都由與其唯一對應的區號和位號所確定。例如:漢字“啊”,編號為 16 區 01 位。
GB2312 字符集的區位分布表:
區號 字數 字符類別
01 94 一般符號
02 72 順序號碼
03 94 拉丁字母
04 83 日文假名
05 86 Katakana
06 48 希臘字母
07 66 俄文字母
08 63 漢語拼音符號
09 76 圖形符號
10-15 備用區
16-55 3755 一級漢字,以拼音為序
56-87 3008 二級漢字,以筆劃為序
88-94 備用區
這本手冊列出了 GB2312 的全部字符和它們的區位號。
GB2312 編碼
GB2312 原始編碼 (encoding) 是對所收錄的每個字符都用兩個字節 (byte) 表示。第一字節為“高字節”,由字符的區號值加上 32 而形成;第二字節為“低字節”,由字符的位號值加上 32 而形成。例如:漢字“啊”,編號為 16 區 01 位。它的高字節為 16 + 32 = 48 (0x30),低字節為 01 + 32 = 33 (0x21),合并而成的編碼為 0x3021。
在區位號值上加 32 的原因大慨是為了避開低值字節區間。
由于 GB2312 原始編碼與 ASCII 編碼的字節有重疊,現在通行的 GB2312 編碼是在原始編碼的兩個字節上各加 128 修改而形成。例如:漢字“啊”,編號為 16 區 01 位。它的原始編碼為 0x3021,通行編碼為 0xB0A1。
如果不另加說明,GB2312 常指這種修改過的編碼。
GB2312的編碼范圍是0xA1A1-0x7E7E,去掉未定義的區域之后可以理解為實際編碼范圍是0xA1A1-0xF7FE。
上面這句有誤,應該說GB2312的每一個漢字由兩個字節構成,其中每一個字節的范圍都在0xA1 ~0xFE,正好每一個字節都有94個編碼范圍,與區位碼個數完全對應。
EUC-CN可以理解為GB2312的別名,和GB2312完全相同。
區位碼更應該認為是字符集的定義,定義了所收錄的字符和字符位置,而GB2312及EUC-CN是實際計算機環境中支持這種字符集的編碼。HZ和 ISO-2022-CN是對應區位碼字符集的另外兩種編碼,都是用7位編碼空間來支持漢字。區位碼和GB2312編碼的關系有點像 Unicode和UTF-8。
GBK字符集編碼
GBK 編碼是GB2312編碼的超集,向下完全兼容GB2312,同時GBK收錄了Unicode基本多文種平面中的所有CJK漢字。同 GB2312一樣,GBK也支持希臘字母、日文假名字母、俄語字母等字符,但不支持韓語中的表音字符(非漢字字符)。GBK還收錄了GB2312不包含的 漢字部首符號、豎排標點符號等字符。
GBK的整體編碼范圍是為:高字節范圍是0×81-0xFE,低字節范圍是0x40-7E和0x80-0xFE,不包括低字節是0×7F的組合。
低字節是0x40-0x7E的GBK字符有一定特殊性,因為這些字符占用了ASCII碼的位置,這樣會給一些系統帶來麻煩。
有些系統中用0x40-0x7E中的字符(如“|”)做特殊符號,在定位這些符號時又沒有判斷這些符號是不是屬于某個 GBK字符的低字節,這樣就會造成錯誤判斷。在支持GB2312的環境下就不存在這個問題。需要注意的是支持GBK的環境中小于0x80的某個字節未必就 是ASCII符號;另外就是最好選用小于0×40的ASCII符號做一些特殊符號,這樣就可以快速定位,且不用擔心是某個漢字的另一半。Big5編碼中也 存在相應問題。
CP936和GBK的有些許差別,絕大多數情況下可以把CP936當作GBK的別名。
GB18030字符集編碼
GB18030編碼向下兼容GBK和GB2312,兼容的含義是不僅字符兼容,而且相同字符的編碼也相同。GB18030收錄了所有Unicode3.1中的字符,包括中國少數民族字符,GBK不支持的韓文字符等等,也可以說是世界大多民族的文字符號都被收錄在內。
GBK和GB2312都是雙字節等寬編碼,如果算上和ASCII兼容所支持的單字節,也可以理解為是單字節和雙字節混合的變長編碼。GB18030編碼是變長編碼,有單字節、雙字節和四字節三種方式。
GB18030 的單字節編碼范圍是0x00-0x7F,完全等同與ASCII;雙字節編碼的范圍和GBK相同,高字節是0x81-0xFE,低字節的編碼范圍是0x40 -0x7E和0x80-FE;四字節編碼中第一、三字節的編碼范圍是0x81-0xFE,二、四字節是0x30-0x39。
Windows 中CP936代碼頁使用0x80來表示歐元符號,而在GB18030編碼中沒有使用0x80編碼位,用其他位置來表示歐元符號。這可以理解為是 GB18030向下兼容性上的一點小問題;也可以理解為0x80是CP936對GBK的擴展,而GB18030只是和GBK兼容良好。
unicode字符集編碼
每一種語言的不同的編碼頁,增加了那些需要支持不同語言的軟件的復雜度。因而人們制定了一個世界標準,叫做unicode。unicode為每個字符 提供 了唯一的特定數值,不論在什么平臺上、不論在什么軟件中,也不論什么語言。也就是說,它世界上使用的所有字符都列出來,并給每一個字符一個唯一特定數值。
Unicode的最初目標,是用1個16位的編碼來為超過65000字符提供映射。但這還不夠,它不能覆蓋全部歷史上的文字,也不能解決傳輸的問題 (implantation head-ache's),尤其在那些基于網絡的應用中。已有的軟件必須做大量的工作來程序16位的數據。
因 此,Unicode用一些基本的保留字符制定了三套編碼方式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是 以8位序列來編碼的,用一個或幾個字節來表示一個字符。這種方式的最大好處,是UTF-8保留了ASCII字符的編碼做為它的一部分,例如,在UTF-8 和ASCII中,“A”的編碼都是0x41.
UTF-16和UTF-32分別是Unicode的16位和32位編碼方式。考慮到最初的目的,通常說的Unicode就是指UTF-16。在討論Unicode時,搞清楚哪種編碼方式非常重要。
UTF-8字符集編碼
Unicode Transformation Format-8bit,允許含BOM,但通常不含BOM。是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24為(三 個字節)來編碼。UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。UTF-8編碼的文字可以在各國支持UTF8字符集的瀏覽器上顯 示。如,如果是UTF8編碼,則在外國人的英文IE上也能顯示中文,他們無需下載IE的中文語言支持包。
GBK的文字編碼是用雙字節來表示的,即不論中、英文字符均使用雙字節來表示,為了區分中文,將其最高位都設定成1。GBK包含全部中文字符,是國家編碼,通用性比UTF8差,不過UTF8占用的數據庫比GBD大。
GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
對于一個網站、論壇來說,如果英文字符較多,則建議使用UTF-8節省空間。不過現在很多論壇的插件一般只支持GBK。