1.ASCII字符--美国信息交换标准码 (0-127),每个字符用7位二进制数表示,字节首位为0.因此,小于80H(128)的均为ASCII符。英文26个字符用一个字节的7位二进制数足以表示。# d" |% g. x; d/ j5 K/ J
2.以gb2312为例,中文汉字共有约七千字,不能用一个字节表示全部的汉字,因此用两个字节来表示一个汉字,为避免与英文字符有重码,每个字节的最高位置1,作为标志位。 J/ q5 Q+ g" J1 ~' G2 T# Q q( P L
3.ASCII分为常用字符(可供打印的字符)与非常用字符(回车、EOF等),常用字符从33(0x21H)号到126(0x7EH)号,共94个字符,汉字就在此范围内编码,因此,中国标准编码的编码范围 :0x21H~0x7EH.两个字节可表示的汉字数为:94×94=8836.8 Y+ A; @* N. ~3 ]' f' r9 u' f
! a/ F3 B# B. \8 R0 S7 o1 B$ b9 v3 j
以上所述编码即国际码
+ J$ M0 z( {4 [8 u( [
+ A& O" C+ I: D" i" `% y1 r 4.由于每个字节的第一个位被置 1, 所以要在原编码(国际码)之上加 0x80H(10000000). 所以汉字的编码范围为 :0xA1H~0xFEH,在PC机中表现为机内码.
/ D7 K% k/ x7 k3 J# `* }5 O 5.区位码0 l u s+ T/ w' l% e7 L0 w& N; c) Z! H
在PC机中,汉字是以机内码形式存储的,每个汉字用两个字节表示,第一个字节用于表示区码,从0xA1H开始为第一区;第二字节用于表示位码,从0xA1H开始为第一位。
# m3 u- F. U8 V* ?6 ~ 我们平时所说的汉字区位码,一般用十进制表示,共分94个区,每区94个汉字(位):0 H0 \# D6 I, p; ]; ?! V* A* Q
; ^" |! S# F" B9 X3 B2 g7 D) H 01-09区 特殊字符区
, A4 x X! @* H) c- _4 } 10-55区 一级汉字区
2 d; E2 u* \0 E. f 56-87区 二级汉字区( |) v2 `8 E; K# }5 f
: D! S1 r" u' @9 S1 s$ z( ` 在汉字字库中:
$ T1 _$ G* m& [& _4 d) Q# k, g* y2 I4 W( Q+ Q) A7 R
区码=机内码第一字节-0xA0H
+ n% Y# @7 O2 n 位码=机内码第二字节-0xA0H/ z4 G6 Q1 x* @ v
9 ~2 p( F6 X) b# K5 B 6.国际码 区位码 机内码 之间的关系:7 t z# r2 f4 R$ F8 U- e; }+ a$ L
: L, ^% t/ N3 l9 A 机内码=国际码+8080H3 I! n4 ]+ p5 `( Y E
7 D% Z( L# E B) X/ y* Y( f: g# K7 Z
区位码=机内码-0xA0H. k# X# ^1 k; }, x* H/ ~, f
! H3 y ^' c; U3 P
国际码=区位码+2020H7 t) b0 q! v8 i( e6 u! R
0 }+ Q: F: k2 l. |$ T
如:“陈”的汉字区位码:1934(16进制为 1322H)
. n! z% F" G: H3 Z( i5 N9 W9 y 在Linux下,用文本编辑器输入"陈",保存为test; m6 w' e# p7 M8 R" V" L
od -h test
3 W# Z6 c* P; R6 k: O2 b& ? 显示为:
, ~' y' o$ n! j) Q w( H% M 0000000 c2b3 000a
2 c2 \3 c% N) O 0000003
3 f0 [) D2 Q, h- S 6 V/ y+ h+ M5 H0 z& ^
区码=b3-a0=13; q" ^0 L' k' f [+ p. ]6 W# K
位码=c2-a0=22 |