1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。/ E! W" S# n6 Y* z, ?
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。# \' F" l0 U% |, y
3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836./ t/ f. y3 g6 ^' X0 u! C: f
- E9 x4 t( P2 N9 m 以上所述编码即国际码' }& b& w; N4 ]+ N
% G# n' A- ^& O) n- y
4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
( J& }# Q5 G; e* ^) V% e 5.区位码
0 S' ], z& ?: @ 在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。2 }+ ^0 C; P% h. r2 K! X+ K
我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):$ B9 K1 Z( \/ @2 X& B# H' p
8 n, R! d( {, [1 y: N, X8 F
01-09区 特殊字符区
[/ ^+ G9 |5 U0 P 10-55区 一级汉字区* }: Y) m$ ` L* r! Z
56-87区 二级汉字区
0 t! d/ d1 i* V! p1 \4 A * K7 r( X. O. Y6 K5 c. O
在汉字字库中:+ f! r% |4 [. ?! }# M6 S
5 q3 S, N0 g' E5 D2 t: i
区码=机内码第一字节-0xA0H/ a+ q# }+ R2 V; W
位码=机内码第二字节-0xA0H e5 j' `" G: D
4 {9 W; J `) O# `; v: B
6.国际码 区位码 机内码 之间的关系:
6 h) H+ C) v$ J# d: A- G
8 L7 X8 D( I3 ? 机内码=国际码+8080H
U' d/ G2 ?$ l; i$ _6 N/ Z1 f4 R7 C: ]
区位码=机内码-0xA0H; x. v# x$ R) K- c; J0 i
' q, n9 l9 c# O3 @% I9 `6 F+ K* H 国际码=区位码+2020H( y6 \) i# U T% _
r' F# D8 K6 o1 O1 j5 E 如:“陈”的汉字区位码:1934(16进制为 1322H)
7 ?# k3 N' ]6 z0 K. U$ v; M' w 在Linux下,用文本编辑器输入"陈",保存为test
! T' C$ x+ U( m( R1 b od -h test
. P% {2 i& f9 l 显示为:
4 u0 F7 {0 |2 Q, ~0 l 0000000 c2b3 000a
! U7 c1 R. C7 G1 ]1 y1 u1 e! d$ S( {* i 0000003# w$ `: c9 N/ X9 M6 z* K! Q- O- b
( ?2 n7 e5 m& N V, a1 |
区码=b3-a0=13
/ j8 M* L( D4 V' o r 位码=c2-a0=22 |