1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。: o) L0 O2 K1 t) D+ Q1 q
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。
% T4 ?5 A7 n$ T+ Q# F( N; [ 3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.
* \, p/ \# L6 y' A+ L0 ~1 B. n% M4 `
以上所述编码即国际码
9 c- b, \9 e4 X2 O1 M% Y" v& ]. f T1 U' `$ a( z/ z
4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
% B# I5 Y$ z! [' z6 M s W( R 5.区位码5 z( {1 E9 r( D( t) N' a1 H: p1 u
在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。
7 U0 p1 U5 x `6 @% M! @ 我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):
! t. W3 H. e! r% b3 ?! v) _9 O4 q' [+ p8 q2 H% w% h
01-09区 特殊字符区
H% |+ w! S! p) a0 x# P8 O 10-55区 一级汉字区# j0 ~2 F' k8 y
56-87区 二级汉字区5 b; O" Y" G! m" s
1 k: d- U6 Q* V0 W% B0 A 在汉字字库中:
5 d) J T7 \* i* D' W2 I1 b8 a0 d- j% d; w3 E
区码=机内码第一字节-0xA0H0 b6 Q; d9 W; c, n+ |9 U
位码=机内码第二字节-0xA0H
' m7 u' t M5 B. K0 n4 ?, H
8 M# }1 }5 x. E9 q$ k6 c 6.国际码 区位码 机内码 之间的关系:
' \8 O, G2 K/ e0 |4 Y& S
' p7 m( g+ F6 \& s 机内码=国际码+8080H
* \2 Q4 [: j3 |. T7 ^7 `0 h2 m7 D' n! ?4 F$ Q9 H
区位码=机内码-0xA0H: T- }8 a1 }4 k) G1 `( _0 [3 `( | Z
+ F/ p" h7 m0 O1 q6 `/ u
国际码=区位码+2020H
# r D$ c3 R# M+ ]9 @! x5 \) q1 z; N: ^6 i
如:“陈”的汉字区位码:1934(16进制为 1322H)3 Q& O/ }4 C/ i P6 o: k6 P$ _
在Linux下,用文本编辑器输入"陈",保存为test
" k! E' Z8 E7 Z l5 f& Z od -h test5 c( b, }9 f1 v0 E7 H
显示为:
. S' V6 X) y2 x& Y( D 0000000 c2b3 000a
' ~ U9 M5 I5 q9 b( { 0000003
. |* o; Y% i; }; m# e) q & y* g8 i1 B W* U3 W5 o
区码=b3-a0=13% M; H0 b! Y0 O- U; _
位码=c2-a0=22 |