1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。& n& N* ] _& X S) `
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。
7 Z; {5 {. }7 l5 Q 3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.
[6 r) z' W( G0 T4 k3 x5 c7 p9 D4 s) Z8 [( M- h" W. z
以上所述编码即国际码
) o8 e4 o b+ u% B4 c( a+ n9 {+ Z
* z- o3 v- ^9 T8 h5 Y f8 u) ?% w 4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码." _" o6 I3 D( j( o; z% R: u
5.区位码
& J7 Q: H. Y7 b$ Y9 \ 在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。
; |' ?" R$ `0 C& |; A 我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):
- z1 i8 c0 l5 Y0 R7 l( E) q. ?$ u- G1 W0 W0 X* p+ A4 P( @* x
01-09区 特殊字符区0 U) U5 S* |* ?! C" L
10-55区 一级汉字区
" a5 Q" }2 r" S' W( G H 56-87区 二级汉字区) t! _- C0 P5 z, I/ L( T7 b
1 K+ z; \* k: A
在汉字字库中:
6 E0 \8 e2 h! S- ?2 l( Q( U) i
' E% V1 z O, g 区码=机内码第一字节-0xA0H Z5 w$ l5 g9 }+ i" Q& m! c
位码=机内码第二字节-0xA0H
4 @$ H( s+ P8 z$ T- L ^5 ~
' M- d8 _8 ^4 l- w 6.国际码 区位码 机内码 之间的关系:1 D* z0 H# R Q$ _, C$ @: A" m
* r F4 e4 U* D& L
机内码=国际码+8080H& N- J, i; g+ S$ n5 X9 r
3 r( `: F! u1 |- _6 b 区位码=机内码-0xA0H
5 |: H( X5 T: E' `% n) Z" n; u1 k! D/ L6 e3 @
国际码=区位码+2020H
+ I: }. Z: @: b: S. e* W, L# u1 F/ M5 J3 `( I R( g
如:“陈”的汉字区位码:1934(16进制为 1322H)
* ], Q3 M+ y6 R* d6 K: d 在Linux下,用文本编辑器输入"陈",保存为test
! t# t0 }$ T+ Q s od -h test# D ]" E+ s: x! L) @
显示为:, ]5 \' `% `: R* |
0000000 c2b3 000a; M/ P0 d' Q4 j* C" @
0000003# P6 h2 \4 A5 O$ X9 r
$ m. C3 S, z8 }9 v T: c
区码=b3-a0=13! H" H& C2 y; G
位码=c2-a0=22 |