1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。. U- L6 H1 Q1 B; u' M
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。
; f* e' B: K; o0 L* u 3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.0 V% f* _0 ~& j+ [: ~
& p7 r7 |5 ?: o0 K4 i9 f
以上所述编码即国际码& ]% N0 ~% B8 I( i% O/ |0 d; ^ W
% Z+ l- `5 o3 |# T, I$ ^, B 4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
6 v; N3 h2 U1 E6 t 5.区位码
4 A3 `7 W* _5 i5 t, S9 J+ h 在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。& b H5 r6 J0 `- v- B. C
我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):* ~! @7 W3 s1 T ~8 P7 W- N
/ z" r" o1 r' O
01-09区 特殊字符区9 \( P. k+ n. `
10-55区 一级汉字区
/ D$ z1 }" R' M2 C. { 56-87区 二级汉字区
# ~; P; Z0 j9 Z
% ^/ Q# z* y% c4 Q2 Q- ? 在汉字字库中:' M4 f! a/ c0 J, i! ]( s& z3 J9 n
5 S1 D8 f. J: Y; t& W! N0 q4 p 区码=机内码第一字节-0xA0H
) k7 r7 L. {: @4 v% G 位码=机内码第二字节-0xA0H5 B' e1 b$ Y/ s7 i$ ]/ d* C
/ @% ?5 W" @4 i, P7 j) M; n# Q
6.国际码 区位码 机内码 之间的关系:7 M( O6 [, j4 k
7 u) |. z1 g7 y, ~
机内码=国际码+8080H) `+ d8 J+ \& Y- H
) D6 e1 K. _# X3 @0 C6 i 区位码=机内码-0xA0H3 l$ |! j0 j; ]) Y' V4 B' |
0 ~/ J' @0 S8 G
国际码=区位码+2020H ?7 E+ g: k, g; W5 i
5 }) s1 a; O% F2 T
如:“陈”的汉字区位码:1934(16进制为 1322H)& a! U# [+ e5 O3 u0 V
在Linux下,用文本编辑器输入"陈",保存为test& Y' ^7 T' W# O$ A, C
od -h test
- O* ?3 P7 h( [& U% }/ H; d% h& t 显示为:9 n! Q/ i; j0 I- |4 g W1 R
0000000 c2b3 000a' V; _0 L Y0 d# j' p/ O" |
00000038 \: [% u2 v% S& j/ W7 L" t( r( K
- U/ O6 S) m9 X
区码=b3-a0=13
- ^0 Z( F! O2 s& A0 O) s) F 位码=c2-a0=22 |