分类:
2007-02-06 16:51:16
参考文献
1 (ref1: ):
汉字的编码和表示
1)汉字交换码(国标码)
汉字交换码(国标码)主要用于汉字信息交换。
国标码:以国家标准局1980年颁布的《信息交换用汉字编码字符集"基本集》(代号为gb2312
80)规定的汉字交换码作为国家标准汉字编码。 gb2312 80中共有7445个字符符号: 汉字符号6763个 一级汉字3755个(按汉语拼音字母顺序排列) 二级汉字3008个(按部首笔划顺序排列)非汉字符号682个
gb2312 80规定,所有的国标码汉字及符号组成一个94 94的方阵。在此方阵中,每一行称为一个"区",每一列称为一个"位"。这个方阵实际上组成一个有94个区(编号由01到94),每个区有94个位(编号由01到94)的汉字字符集。一个汉字所在的区号和位号的组合就构成了该汉字的"区位码"。其中,高两位为区号,低两位为位号。这样区位码可以唯一地确定某一汉字或字符;反之,任何一个汉字或符号都对应一个唯一的区位码,没有重码。
区位码分布情况如下:
区
号 内 容 1区 键盘上没有的各种符号 2区各种序号 3区 键盘上的各种符号(按中文方式给出) 4 -5区 日文字母 6区 希腊字母 7区 俄文字母 8区标识拼音声调的母音及拼音字母名称
9区 制表符号 10- 15区 未用 16-55区 一级汉字(按拼音字母顺序排列) 56- 87区二级汉字(按部首笔划顺序排列) 88- 94区 自定义汉字
由上可以看出,所有汉字与符号的94个区,可以分为四个组:
①1
-15区:为图形符号区。其中1 9区为标准符号区;10 15区为自定义符号区。
②16 -55区:为一级汉字区,包含3755个汉字。这些区中的汉字按汉语拼音顺序排序,同音字按笔画顺序列出。
③56
-87区:为二级汉字区,包含3008个汉字。这些区中的汉字是按部首笔划顺序排序的。
④88 -94区:为自定义汉字区。
国标码规定,每个汉字(包括非汉字的一些符号)由2字节代码表示。每个字节的最高位为0[注意是0,
没有写错的啊],只使用低7位,而低7位的编码中又有34个适用于控制用的,这样每个字节只有27 - 34 = 94个编码用于汉字。2个字节就有94
94=8836个汉字编码。在表示一个汉字的2个字节中,高字节对应编码表中的行号,称为区号;低字节对应编码表中的列号,称为位号。
汉字国标码的范围用二进制表示是:
00100001 00100001 01111110 01111110 (1 32)10 (1 32)10 (94 32)10 (94 32)10 7 位ascii码是128个字符组成的字符集。其中编码值0
31(00000000 00011111)不对应任何印刷字符,通常称为控制符,用于计算机通信中的通信控制或对计算机设备的功能控制。编码值32(00100000)是空格字符sp。编码值127(1111111)是删除字符del。
汉字国标码的起始二进制位置选择00100001即(33)10是为了跳过
ascii码的32个控制字符和空格字符。所以,汉字国标码的高位和低位分别比对应的区位码大(32)10或(00100000)2或(20)h,即:国标码高位 = 区码
20h (h表示十六进制) 国标码低位 = 位码 20h
2) 汉字机内码(内码)(汉字存储码)
汉字机内码(内码)(汉字存储码)的作用是统一了各种不同的汉字输入码在计算机内部的表示。为了将汉字的各种输入码在计算机内部统一起来,就有了专用于计算机内部存储汉字使用的汉字机内码,用以将输入时使用的多种汉字输入码统一转换成汉字机内码进行存储,以方便机内的汉字处理汉字机内码是在计算机内部存储、处理的代码。计算机既要处理汉字,又要处理英文。因此计算机必须能区别汉字字符和英文字符。英文字符的的机内码是最高为为
0的8位ascii码。为了不与7位ascii码发生冲突,把国标码每个字节的最高位由0改为1,其余位不变的编码作为汉字字符的机内码。
汉字机内码的范围用二进制表示是:
10100001 10100001 11111110 11111110 机内码的高位和低位比对应的国标码的高位和低位大(128)10或(10000000)2或(80)h
即:
机内码高位 = 国标码高位 80h
机内码低位 = 国标码低位 80h
又因为:
国标码高位 = 区码 20h
国标码低位 = 位码 20h
所以:
机内码高位 = 区码 a0h
机内码低位 = 位码 a0h
也就是说,机内码高位和机内码低位分别比对应的区码和位码大(160)10或(10100000)2或
(a0)h 例如:汉字"啊"的区位码为"1601",其中区码为(16)10或(10)h,位码为(01)10或(01)h。
则: 机内码高位 = 10h a0h = b0h 机内码低位 = 01h a0h = a1h 所以: 机内码= b0a1h
3)
汉字输入码(外码)
汉字输入码(外码)是为了通过键盘字符把汉字输入计算机而设计的一种编码。英文输入时,相输入什么字符便按什么键,输入码和机内码一致。汉字输入时,可能要按几个键才能输入一个汉字。汉字输入方案有成百上千个,但是这千差万别的外码输入进计算机后都会转换成统一的内码。
汉字输入方案大致可分为以下4种类型:
(1) 音码:如全拼、双拼、微软拼音等
(2) 形码:如五笔字型、郑码、表形码等
(3)
音形码:如智能abc、自然码等
(4) 数字码:如区位码、电报码等
4) 汉字字形码(输出码)
汉字字形码(输出码)用于汉字的显示和打印,是汉字字形的数字化信息。汉字的内码是用数字代码来表示汉字,但是为了在输出时让人们看到汉字,就必须输出汉字的字形。在汉字系统中,一般采用点阵来表示字形。
16 *16汉字点阵示意 16 * 16点阵字形的字要使用32个字节(16 * 16/8= 32)存储,24 * 24点阵字形的字要使用72个字节(24 *
24/8=72)存储。
一般来说,表现汉字时使用的点阵越大,则汉字字形的质量也越好,当然每个汉字点阵所需的存储量也越大。
5)
汉字地址码
汉字地址码是指汉字库(这里主要指整字形的点阵式字模库)中存储汉字字形信息的逻辑地址。在汉字库中,字形信息都是按一定顺序(大多数按标准汉字交换码中汉字的排列顺序)连续存放在存储介质上的,所以汉字地址码也大多是连续有序的,而且与汉字内码间有着简单的对应关系,以简化汉字内码到汉字地址码的转换。
参考文献
2 (ref2: )
不用通常的汉字输入法能输入汉字吗?
在英文状态下能打印出汉字吗?请看下面两个实验:
实验一·启动ucdos汉字系统,在“英文”输入状态下,将副键盘切换成数字输入状态,然后在系统提示符后面作如下操作:
左手按住alt,右手依次敲副键盘上的1、7、6,松开alt键;再按住alt键,依次敲副键盘上的1、6、1,松开alt键,这时屏幕光标处出现了一个“啊”字。
实验二·打开自带汉字库的打印机(如lq150k,lq1600k等),启动dos(不启动任何汉字系统),在系统提示符后面作如下操作:
①键入命令: copy con prn←┘
②同实验一中输入“啊”的操作;
③敲回车键,再敲f6键,再敲回车键。
这时打印机打印出一个“啊”字。
在实验一中,我们在汉字系统的英文输入状态(注意,不是在拼音、五笔字型等汉字输入状态)下输入了汉字;实验二中,在英文状态下打印出了汉字。道理何在呢?
原来,计算机上使用的汉字有两类代码,一类叫外码,用来输入汉字,如拼音码、郑码、五笔字型码等。由于人们不断寻求更佳的汉字输入法,因此外码也就层出不穷。不同的外码规则也不同,如果计算机内部存储汉字时,也采用这些五花八门的编码,势必使汉字系统过于复杂。因此,不论用什么输入法输入的汉字,在存入存储器时,都将它的外码转换成一种统一的代码,这就是汉字内码。
一个汉字的内码由两个字节组成。汉字内码与区位码之间有一个简单的数学关系:
内码第一字节=区码 160
内码第二字节=位码 160
比如,查区位码表知道,“啊”字在16区01位,它的内码为:
第一字节=16 160=176
第二字节=1 160=161
这下就明白了,在前面的两个实验中,我们是利用alt键加副键盘能输入字符代码的功能,直接用内码输入了汉字“啊”。
我们知道,英文字符的代码ascii只用一个字节表示。为什么一个汉字要用两个字节来表示呢?原来一个字节(8位二进制数)能表示的最大整数范围是
0~255,也就是说最多能表示256种不同的状态,这用于表示几十个英文字符足够了。但是汉字有成千上万个,所以至少要用两个字节(16位二进制数)来编码。两个字节最多可有65536种不同的编码。
由于大多英文软件只处理单字节对象,而汉字内码又是双字节的。在汉字系统中使用英文软件来处理汉字时就会带来一些问题。比如我们用dos
6.2中的edit编辑一个文本文件(vi中编辑中文也一样),要删掉其中的一个汉字时,要敲两次删除键才能删掉。若是只删了一下,后面的汉字就变得面目全非了。道理很简单:删一下,只删掉了汉字内码的一个字节,剩下的一个字节和下一个汉字的头一个节就构成了另一个汉字或符号的内码,于是就显示出和这个内码对应的汉字或符号。依次错位,后面的汉字就全变了。
在汉字系统中使用英文软件还会带来另一个问题:由于在原来的英文系统中规定大于127的代码用来代表一些特殊符号,如英文的制表符、欧洲其它文字的字母等。而汉字的内码的每个字节的值都大于127,这样,即使是在汉字系统中,计算机在遇到汉字内码时可能会分不清是汉字还是其它特殊符号。这是我们在汉字系统中运行有些英文软件时会出现怪字或怪符号的原因。目前较流行的汉字系统都在努力改进,力争能分辨出汉字内码和特殊字符的代码,但仍难免疏漏。你可作一个实验:在汉字系统(如常用的ucdos)中执行dos命令tree,在显示出来的结果中就会出现怪字,解决的方法很简单:暂时转到英文显示状态(不用退出汉字系统,如在ucdos中按ctrl-f7即可),原来英文系统中的特殊符号就不会被错认成汉字了。
明白上述道理,也不难理解为什么在英文状态下显示的汉字是全是一些如“天书”的怪符号。因为在英文状态下所有的字符代码均不会被认为是汉字的内码,其值大于127的汉字内码都被当成特殊字符了。
顺便说一下,我们常用的汉字系统的汉字内码为国标码(或异型国标码),而港台地区流行的汉字系统则采用的是另一种汉字内码──big-5码,由于内码不同,虽然都是汉字系统,却互不兼容。为此,一些两种内码转换的工具程序应运而生,如ucdos中的实用程序convert。但由于国标码与big-5码定义的汉字并非──对应的关系,因此这些转换程序不能百分之百地转换所有汉字,有些还得靠手工辅助完成。
问题:
1>. 我们通常输入的文本文件(txt)中保存的是什么编码? 在输入的过程中各个编码是怎么转换的呢?
我个人认为是内码. 输入法软件将我们输入的编码(键盘上的符号键)转换为计算机内部存放的编码(内码).
eg:
用智能拼音输入法输入hao, 在选择1, 文本中出现"好", 输入码为: hao1, 内码为: c3ba, 以后其他程序读取该部分就是c3ba数据了.
将输入码转换为内码的工作由输入法软件完成.
c3ba我们是不知道他代表什么的, "好"的显示工作由该文本编辑器来完成,
一旦文本编辑器读取的为c3ba就去查询汉字字形码(输出码)最总显示的为"好"的点阵形式, 这样我们就可以看见"好"这个汉字的.
在ref2中他使用英文输入法也可以输入汉字是因为他使用输入到机器中的就是c3ba计算机的内码,
这个时候文本编辑器再将内码转换成输入码显示. 因为最总的内码是一致的所以就可以看到中文了.
这里有个问题就是c3ba保存的是什么类型的内部码呢(gb2312, gbk, ... utf-8)?
当然只可能是gb2312, gbk中的, 因为utf-8占有4字节了. 那到底使用那种编码作为内部编码保存数据的呢?
我想这个问题应该是看各个输入法使用的是什么编码吧.
使用red
hat 9中的内码输入法输入"bac3"就可以看到"好"了.
-------
但是我的项目经理说我的解释有问题(他说在这中间还有一个交换码, 不是太懂), 不知道那位兄弟做过输入法软件开发的应该对这方面比较了解,
希望得到一个更准确的答案, 多谢!
项目经理说法:文本文件中保存的为交换码,交换码是唯一的。