1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。
9 a$ ^% _! @0 O$ ] n3 S( e 2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。
: q, D. ~4 q* }4 j9 \# Q2 k4 o 3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.
9 {8 ^( R0 t8 G2 m, R; g& ?( q7 L8 U- o: T' `( L/ R
以上所述编码即国际码, v% k3 o7 O' o* w. o, ^
) t5 H) Q# j* r4 s) l 4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
+ E/ l7 _5 g1 p7 m0 | 5.区位码' z* L' K7 b D. w3 ]
在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。
# k5 N% S8 ]5 Z, j- F! } 我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):
" O4 E6 i" [& ~4 h% k8 _ {
( L, y5 m H5 m2 e3 Y; | 01-09区 特殊字符区
: ]1 g9 l1 n* ]0 E, q: Z, l 10-55区 一级汉字区1 X3 l* b' D5 O8 z9 E; T( J6 `
56-87区 二级汉字区
, v# c6 g* P" }4 ] ' F" _" @) N; h
在汉字字库中:
- m3 [2 G/ g3 x
A& K; w) A4 c 区码=机内码第一字节-0xA0H
$ ?+ g+ ], M$ c2 l8 [ 位码=机内码第二字节-0xA0H
4 i7 i6 m$ U4 x& w6 F7 J; r0 e: E/ L7 R- Q) u
6.国际码 区位码 机内码 之间的关系:
3 l7 q7 u. R i7 z: b% G1 r/ N5 Y, |" M( y8 g+ ?
机内码=国际码+8080H" q/ l! w o7 C+ P! f) E4 H/ u
4 ^6 K9 p. E1 j% i6 I7 B
区位码=机内码-0xA0H& v. g2 i- M7 G5 c0 A9 R% V2 ?
! A% x" Z+ V) T, O" k7 c$ \* D 国际码=区位码+2020H
) G. S# P8 A; D. X( D* G. U2 S* l
$ M+ |3 P" X; {5 g; Z* o 如:“陈”的汉字区位码:1934(16进制为 1322H)0 h) y5 @0 o& ?0 Q
在Linux下,用文本编辑器输入"陈",保存为test
: R8 m) S( x5 l8 N" Y+ K; d od -h test5 M7 Q5 Z* Q' s( u
显示为:$ D5 ?8 S2 ~1 [$ u0 u
0000000 c2b3 000a
' U8 T& {. i$ W$ [* z 0000003& u- G& f2 a% r& L" p) ?
$ d7 M, z; u1 N2 N# V 区码=b3-a0=13! f, J) ?& f @0 o6 V B# m
位码=c2-a0=22 |