1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。) O$ l+ F6 l/ V) M
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。3 Q% j P$ \; B- }$ h
3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.
* h8 v' U. Y/ f4 X0 W) Q$ p3 C% e1 n# S* z8 V3 d4 l2 P, _
以上所述编码即国际码* C3 S% I5 M& C
; s0 I, I0 I5 K; m7 x' l" e$ `
4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
! t; O' o: y' U7 f. [! X# _ 5.区位码
8 ^- q x. s) K+ @" M 在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。9 I7 w. S# o. _6 Y5 U
我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):4 y% e$ z7 r, s( @& B* H1 Z
8 H2 u" B9 {1 m( [* C" F 01-09区 特殊字符区
* a' O2 W) R* G/ m 10-55区 一级汉字区; b3 i! ?8 t% X& C0 m0 l* k/ U2 B
56-87区 二级汉字区8 q' f! {6 i6 h( Z
* W7 Z! a% m2 n6 w9 F3 `- S
在汉字字库中:
) ?% k) A6 r3 f: X% U1 g& N7 @( v- P
区码=机内码第一字节-0xA0H# Y* q1 x% w! w2 a) I
位码=机内码第二字节-0xA0H/ H w( E' w2 q
) @7 W+ B2 N" a1 [ 6.国际码 区位码 机内码 之间的关系:
# P) c( p, B7 E2 r3 i g
6 m3 J5 R$ b x! C 机内码=国际码+8080H! K( Q6 f( x- o$ T' q
( U$ ~ [, e. g
区位码=机内码-0xA0H
4 x/ b o; ]1 X
$ N- Q( P* D+ z3 O0 c1 L 国际码=区位码+2020H
5 A4 L2 D' {4 D3 ~# J
% ]% l6 O7 ?& u d 如:“陈”的汉字区位码:1934(16进制为 1322H)
/ Q0 e, K! G; G9 z" w2 ^5 l 在Linux下,用文本编辑器输入"陈",保存为test
8 p& ?1 | P, M5 k* m3 U. k- | od -h test! ?% Z l% a- o
显示为:# U0 B7 g+ m# I
0000000 c2b3 000a/ _( u$ B' X0 T7 [! z
0000003" m+ A$ t( p; U
1 ^5 ?) U: ]0 f 区码=b3-a0=13
. S0 z; l; `- h 位码=c2-a0=22 |