1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。
$ q, `2 i7 `& X; Z 2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。
# _! }( w h6 b; d1 ]/ X 3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.
' d+ g, i. H' T, i
: S& O' a* f0 Q* E0 v% o- P6 h 以上所述编码即国际码
4 b" {$ Z( \4 c/ x- N% ^
& U) b9 `, ?. p 4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
/ A( J/ [2 L; y$ C3 Y; M$ @ 5.区位码
u1 T) y7 l; |- X 在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。
0 B, c+ W4 c L& A1 B3 B0 T1 h3 [ 我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):9 k; X' l) V7 `- U+ ^ r" |3 v
$ ~6 R8 S8 c; X* M) b# B 01-09区 特殊字符区
2 {3 ]9 ?/ L( V: i r# W3 M, P 10-55区 一级汉字区+ O/ r+ Y) Y( k5 T6 X$ o/ |+ m3 E
56-87区 二级汉字区
7 D: R. Y$ I9 n8 p& Y& T % n0 I E$ o& g0 j) ]4 Y( u
在汉字字库中:
! b8 P8 S0 _) z1 b3 O. M# Z# ]4 ^. l* J' M# f/ B- h9 m* ]
区码=机内码第一字节-0xA0H) S! q0 ~5 D+ r2 M6 n; A0 S$ z
位码=机内码第二字节-0xA0H
4 Y" q6 g) Y c( f1 P# g, o9 ]0 u3 Q) h, W/ L9 t' v
6.国际码 区位码 机内码 之间的关系:
. N- S: c% r& }1 D" i* U5 S5 ?- _# E/ j' H' w
机内码=国际码+8080H& Q0 m0 a9 l- g( Z* @' E9 l% x1 j* E
0 B+ e) h0 ~' ?. n 区位码=机内码-0xA0H
/ c _. ^3 q9 K6 f6 C2 }( h5 Y
/ {* f# Y6 T0 |' i* _ 国际码=区位码+2020H
. a3 R6 \4 B( Y" U; w0 ~+ L2 g; A3 R, m, X; g
如:“陈”的汉字区位码:1934(16进制为 1322H)
: V( R6 Q5 a2 e$ T7 s 在Linux下,用文本编辑器输入"陈",保存为test" C) S6 [3 n& ]
od -h test
$ |# `- O6 _) V _8 R( D 显示为:
2 j" P, I3 B. D! A/ C: `+ ^( L 0000000 c2b3 000a
& D2 G" n: X; E( W& Y- _! R 00000036 Z5 y& G m( R3 h! }# e
& H* `* H3 K: v0 R& h2 l
区码=b3-a0=13
0 J9 n' E& v) S5 G% ~ 位码=c2-a0=22 |