1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。: |7 s9 x# d" L$ p4 p# |
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。+ K2 z9 i& ^, V6 @
3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.
5 `: Z5 o6 L& B/ `/ Z5 ^* G; g/ q
以上所述编码即国际码
) `3 W0 C( B# L' M7 p& v+ E" f6 I' k
1 C( k! f' H9 |) y 4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.' y( k, z# I, ]5 W, L4 m0 n7 m
5.区位码
6 q7 Q* M: q' z# a3 L* Q- W7 I 在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。
0 ^7 E1 q% R" C% L2 j! H& ] 我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):# L% T# K/ U8 \+ p& Q- `5 k8 p
6 V1 I3 g' I' E; S5 b
01-09区 特殊字符区+ _4 S0 s6 o- U. S
10-55区 一级汉字区* m0 P0 v% S) M: v; ]+ X" _
56-87区 二级汉字区: a, Z, C6 @* o
" _8 g W/ M. T h7 w) f5 Y) U } 在汉字字库中:
$ I( w8 P8 P- d" H w8 g* I, C0 M
区码=机内码第一字节-0xA0H
" O4 t& m# d& i 位码=机内码第二字节-0xA0H/ u( X8 [) q4 N7 I$ J
$ [" E/ C8 H& `! J9 U
6.国际码 区位码 机内码 之间的关系:9 J& M- {; I. H! ? w
/ t2 t- q4 j+ @+ ^: ^0 ? 机内码=国际码+8080H
: @; n, J" P6 c1 Y" T4 G
! H P' ~ }% [- C 区位码=机内码-0xA0H
: L V& e) }8 ?4 t2 ^% W2 k9 \0 u& ?+ v' I' S
国际码=区位码+2020H2 c \/ p0 G. e% f+ }6 m
, K" A9 Q* f4 ^/ n( r) r" I& @
如:“陈”的汉字区位码:1934(16进制为 1322H)1 L6 d0 \) B* K+ i9 X
在Linux下,用文本编辑器输入"陈",保存为test
# P# }& O& C2 l/ M od -h test
s1 m% U$ O9 r 显示为:* ^1 {/ H" z2 l
0000000 c2b3 000a2 d) ^, r0 v& b
0000003
# W6 u# O* }, N2 N5 ?" @ + Q( g7 D/ P8 S- ^) V. @
区码=b3-a0=13. I( v4 s+ ?4 i, |' \0 ^
位码=c2-a0=22 |