ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等幾種常用編碼區別
Posted on 2009-10-29 21:58 xcp 閱讀(5666) 評論(0) 編輯 收藏 所屬分類: JAVA
最近老為編碼問題而煩燥,下定決心一定要將其弄明白!本文主要總結網上一些朋友提供的 ascii,ISO-8859-1,unicode, utf8,gb2312,big5,gbk,gb18030等幾種常區別.
1. ASCII碼
目前計算機中用得最廣泛的字符集及其編碼,是由美國國家標準局(ANSI)制定的ASCII碼(American Standard Code for Information Interchange,美國標準信息交換碼),它已被國際標準化組織(ISO)定為國際標準,稱為ISO 646標準。適用于所有拉丁文字字母,ASCII碼有7位碼和8位碼兩種形式。
我們知道,在計算機內部,所有的信息最終都表示為一個二進制的字符串。每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱為一個字節(byte)。也就是說,一個字節一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從0000000到11111111。
ASCII表
ASCII值 |
控制字符 |
ASCII值 |
控制字符 |
ASCII值 |
控制字符 |
ASCII值 |
控制字符 |
0 |
NUL |
32 |
(space) |
64 |
@ |
96 |
、 |
1 |
SOH |
33 |
! |
65 |
A |
97 |
a |
2 |
STX |
34 |
” |
66 |
B |
98 |
b |
3 |
ETX |
35 |
# |
67 |
C |
99 |
c |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
d |
5 |
ENQ |
37 |
% |
69 |
E |
101 |
e |
6 |
ACK |
38 |
& |
70 |
F |
102 |
f |
7 |
BEL |
39 |
, |
71 |
G |
103 |
g |
8 |
BS |
40 |
( |
72 |
H |
104 |
h |
9 |
HT |
41 |
) |
73 |
I |
105 |
i |
10 |
LF |
42 |
* |
74 |
J |
106 |
j |
11 |
VT |
43 |
+ |
75 |
K |
107 |
k |
12 |
FF |
44 |
, |
76 |
L |
108 |
l |
13 |
CR |
45 |
- |
77 |
M |
109 |
m |
14 |
SO |
46 |
. |
78 |
N |
110 |
n |
15 |
SI |
47 |
/ |
79 |
O |
111 |
o |
16 |
DLE |
48 |
0 |
80 |
P |
112 |
p |
17 |
DCI |
49 |
1 |
81 |
Q |
113 |
q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
r |
19 |
DC3 |
51 |
3 |
83 |
X |
115 |
s |
20 |
DC4 |
52 |
4 |
84 |
T |
116 |
t |
21 |
NAK |
53 |
5 |
85 |
U |
117 |
u |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
v |
23 |
TB |
55 |
7 |
87 |
W |
119 |
w |
24 |
CAN |
56 |
8 |
88 |
X |
120 |
x |
25 |
EM |
57 |
9 |
89 |
Y |
121 |
y |
26 |
SUB |
58 |
: |
90 |
Z |
122 |
z |
27 |
ESC |
59 |
; |
91 |
[ |
123 |
{ |
28 |
FS |
60 |
< |
92 |
" |
124 |
| |
29 |
GS |
61 |
= |
93 |
] |
125 |
} |
30 |
RS |
62 |
> |
94 |
^ |
126 |
~ |
31 |
US |
63 |
? |
95 |
— |
127 |
DEL |
NUL 空字符(Null) |
VT 垂直制表 |
SYN 空轉同步 |
SOH 標題開始 |
FF 走紙控制 |
ETB 信息組傳送結束 |
STX 正文開始 |
CR 回車 |
CAN 作廢 |
ETX 正文結束 |
SO 移位輸出 |
EM 紙盡 |
EOY 傳輸結束 |
SI 移位輸入 |
SUB 換置 |
ENQ 詢問字符 |
DLE 空格 |
ESC 換碼 |
ACK 承認 |
DC1 設備控制1 |
FS 文字分隔符 |
BEL 報警 |
DC2 設備控制2 |
GS 組分隔符 |
BS 退一格 |
DC3 設備控制3 |
RS 記錄分隔符 |
HT 橫向列表 |
DC4 設備控制4 |
US 單元分隔符 |
LF 換行 |
NAK 否定 |
DEL 刪除 |
英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用ASCII碼表示。于是,一些歐洲國家就決定,利用字節中閑置的最高位編入新的符號。比如,法語中的é的編碼為130(二進制10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號。
但是,這里又出現了新的問題。不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (?),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0—127表示的符號是一樣的,不一樣的只是128—255的這一段,所以出現后面的統一編碼方式。
注:
若想得到更詳細的參見http://ascii.911cha.com/
2、各地的方言
在中國,大陸最常用的就是GBK18030編碼,除此之外還有GBK,GB2312,這幾個編碼的關系是這樣的。
字符必須編碼后才能被計算機處理。計算機使用的缺省編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,但為了處理漢字,又設計出用于簡體中文的GB2312和用于繁體中文的big5。
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
GB2312支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符。
從ASCII、GB2312到GBK,這些編碼方法是向下兼容的,即同一個字符在這些方案中總是有相同的編碼,后面的標準支持更多的字符。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高字節的最高位不為0。按照程序員的稱呼,GB2312、GBK都屬于雙字節字符集 (DBCS)。
2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。從漢字字匯上說,GB18030在GB13000.1的20902個漢字的基礎上增加了CJK擴展A的6582個漢字(Unicode碼0x3400-0x4db5),一共收錄了27484個漢字。
CJK就是中日韓的意思。Unicode為了節省碼位,將中日韓三國語言中的文字統一編碼。GB13000.1就是ISO/IEC 10646-1的中文版,相當于Unicode 1.1。
GB18030的編碼采用單字節、雙字節和4字節方案。其中單字節、雙字節和GBK是完全兼容的。4字節編碼的碼位就是收錄了CJK擴展A的6582個漢字。例如:UCS的0x3400在GB18030中的編碼應該是8139EF30,UCS的0x3401在GB18030中的編碼應該是8139EF31。
微軟提供了GB18030的升級包,但這個升級包只是提供了一套支持CJK擴展A的6582個漢字的新字體:新宋體-18030,并不改變內碼。Windows 的內碼仍然是GBK。
也就是說Big5支持繁體中文,GB2312支持簡體中文,Big5,GB2312是GBK的子集,GBK是GB18030的子集
日本:SJIS編碼
注:
漢字編碼簡明對照表http://www.knowsky.com/resource/gb2312tbm.htm
3、Unicode
如果把各種文字編碼形容為各地的方言,那么Unicode就是世界各國合作開發的一種語言。
在這種語言環境下,不會再有語言的編碼沖突,在同屏下,可以顯示任何語言的內容,這就是Unicode的最大好處。
那么Unicode是如何編碼的呢?其實非常簡單。
就是將世界上所有的文字用2個字節統一進行編碼。可能你會問,2個字節最多能夠表示65536個編碼,夠用嗎?
Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。現在用的是UCS-2,即2個字節編碼.
以現在的發展肯定是不夠用得,如《康熙字典》收錄了四萬七千零三十五字,《漢語大字典》收錄了五萬六千多個。到目前為止,國際標準組織(ISO)制定國際標準時,共收集到漢字七萬多字,所以出現UCS-4, 即4個字節編碼,由原先的65536個編碼擴展至將近100萬編碼。
注:
中日韓漢字Unicode編碼表:http://www.chi2ko.com/tool/CJK.htm
查詢需要Unicode編碼的字符:
http://www.unicode.org/charts/unihan.html
http://www.nengcha.com/code/unicode/
4、兼容codepage
那么既然統一了編碼,如何兼容原先各國的文字編碼呢?這個時候就需要codepage了。
什么是codepage?codepage就是各國的文字編碼和Unicode之間的映射表。比如簡體中文和Unicode的映射表就是CP936,點這里查看官方的映射表。
以下是幾個常用的codepage,相應的修改上面的地址的數字即可。
codepage=936 簡體中文GBK
codepage=950 繁體中文BIG5
codepage=437 美國/加拿大英語
codepage=932 日文
codepage=949 韓文
codepage=866 俄文
codepage=65001 unicode UFT-8
從936中隨意取一行,例如:0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH.前面的編碼是GBK的編碼,后面的是Unicode。通過查這張表,就能簡單的實現GBK和Unicode之間的轉換
5、UTF-8
現在明白了Unicode,那么UTF-8又是什么呢?又為什么會出現UTF-8呢?
Unicode的最初目標,是用1個16位的編碼來為超過65000字符提供映射。但這還不夠,它不能覆蓋全部歷史上的文字,也不能解決傳輸的問題,尤其在那些基于網絡的應用中。
因此,Unicode用一些基本的保留字符制定了三套編碼方式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列來編碼的,用一個或幾個字節來表示一個字符。這種方式的最大好處,是UTF-8保留了ASCII字符的編碼做為它的一部分,例如,在UTF-8和ASCII中,“A”的編碼都是0x41.
例:11100100 10111101 10100000à0xE4BDA0 “你”字的UTF-8編碼
01001111 01100000 à0x4F60 “你”的Unicode編碼
按照UTF-8的編碼規則,11100100 10111101 10100000分解如下:xxxx0100 xx111101 xx100000,把除了x之外的數字拼接在一起,01001111 01100000就變成“你”的Unicode編碼了.注意UTF-8的最前面3個1,表示整個UTF-8串是由3個字節構成的經過UTF-8編碼之后,再也不會出現敏感字符了,因為最高位始終為1。
Unicode和UTF-8之間的轉換關系表:
0000 0000-0000 007F | 0xxxxxxx
0000 0000-0080 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode編碼轉換到UTF-8,簡單的把Unicode字節流套到x中就變成UTF-8了。
名稱: ?4C.ESL | .↗Evon
口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
mail: 聯系我