实验目的
1.熟悉汉字的机内码,掌握以十六进制形式查看文件内容的方法。
2.理解GB2312—80中汉字的分布规律,掌握区位码到汉字机内码的转换规则。
3.掌握编写程序对文本文件和二进制文件的读写操作。
4.了解中文信息处理的主要研究领域与研究现状。
实验内容
1.使用十六进制编辑器查看自己姓名的机内码。
2.编写汉字区位码查看程序,让用户输入一个汉字从而显示该汉字的区位码。
3.熟悉文件操作,编写程序将同样的数据分别写入文本文件和二进制文件,比较二者的区别。
4.了解中英机器翻译系统的研究进展与实用情况。
预备知识
一、ASCII、GB2312—80与Unicode
因为计算机采用二进制的方式存储数据,所以包括数值、文字、图片、声音和动画等信息在存储到计算机内时,都必须要转换为二进制。人们使用的十进制数值数据存储到计算机中时,也需要转换为二进制,这个过程相对简单,也较容易理解。但人们使用的文字(尤其是中文)是如何存储到计算机中的呢?
·ASCII
ASCII(美国信息交换标准码)是American Standard Code for Information Interchange的缩写,它是一个用于字符编码的美国标准。ASCII起始于20世纪50年代,在1967年定稿,标准的ASCII采用了7位二进制数来表示一个字符,因此至多只能包含128个符号。ASCII中包括了所有的大写和小写英文字母、数字0到9、英文标点符号以及控制字符。
图1.1显示了ASCII中的符号分布情况,这些符号可以被分为图形字符区和控制字符区。图形字符区合计有94个符号,例如,“a”“A”“2”“%”;控制字符区包含了回车、换行、退格等符号。中文的图形字符达到数万个,远远超过94个。因此,不能简单地通过对ASCII进行修改和定制来解决中文在计算机内的表示问题。
图1.1 ASCII中的字符分布情况
·GB2312—80
为了规范、有效地在计算机中处理汉字,我国在1980年发布了GB2312—80汉字编码国家标准,其全称为“信息交换用汉字编码字符集—基本集”。GB2312—80采用两个字节来为汉字编码,其编码范围是高位和低位都在A1H~FEH之间,汉字内码从B0A1H开始,结束于F7FEH,共收录汉字及其他符号7445个,其中汉字6763个,这些汉字被分为一级汉字和二级汉字两个子集。一级汉字按照拼音排序,合计3755个;二级汉字按照偏旁部首排序,合计3008个。
GB2312—80基本满足了当时计算机处理汉字的需要,按照使用频率来看,它所收录的6763个汉字已经覆盖了中国大陆大约99.75%的汉字使用场合。而且当时的计算机存储空间小、运算速度低,如果使用太大的字符集会导致汉字字形库存储空间巨大,降低信息处理涉及的各种检索速度,不利于使用与推广。
·Unicode
由于很多国家和地区都独立设计了在计算机内表示自己所用文字的编码标准,例如,中国大陆有GB2312—80,中国香港和台湾地区有Big-5,它们之间互不兼容,从而导致不同国家和地区之间文档的交互出现了很多问题。显然,避免上述互不兼容的一个有效措施是全球采用同一编码,每一个字符只对应一个编码,每一个编码只对应一个字符。1991年,IBM、DEC、Sun、Xerox、Apple、Microsoft、Novell等公司联合组织了一个协会,创建了Unicode项目。该项目的一个主要目标是:无论什么平台、什么程序、什么语言,为每一个字符只提供一个唯一的编码。Unicode并没有寻找方法来解决兼容当时已经存在的各种编码,而是采取了重新编码的方法。
宏观来看,Unicode编码系统可分为编码方式和实现方式两个层次。编码方式采用了组(group)、面(plane)、行(row)和位(cell)来给字符编码,组可以有128个,而面、行和位都可以有256个,所以有128×256×256×256=2147483648个码位。显然Unicode编码空间非常巨大。目前最多被使用的是0组0面,该面被称为Basic Multilingual Plane(基本多语言平面),简称BMP。该平面一共有256×256=65536个码位,基本满足了目前世界上各种常用字符的使用。虽然每个字符的Unicode编码是确定的,但是在实际传输过程中,考虑到应用于不同系统的平台以及节约存储空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式也被称为Unicode转换格式(Unicode Translation For-mat,简称为UTF),常见的有UTF-7、UTF-8、UTF-16和UTF-32等。UTF-8是目前互联网上使用较多的实现方式,在Web网页编码中被广泛使用。
二、GB2312—80区位码与机内码
GB2312—80在给汉字编码的时候,设计了一个94×94的表格,然后在其中对应的位置放上字符,这样通过行列号就可以唯一地确定每一个字符,该行列号也被称为区位号。GB2312—80中的字符分布情况见图1.2。
图1.2 GB2312—80中的字符分布情况
一个汉字所在的行列号也被称为区位码,区位码通常用十进制数字表示,共4位数字,前两位为区号,后两位为位号。如汉字“国”在第25区第90位,所以它的区位码为2590。图1.3列举了GB2312—80的01区和16区的字符,其中16区是第一个汉字符号区。
图1.3 GB2312—80的01区和16区的字符
但是区位码并不适合直接在计算机中存储汉字,如“码”的区位码为3475,如果直接把3475存储到计算机的两个字节中,将来读取时会和“4”与“U”两个字符的ASCII码混淆。显然,此时需要一种手段在计算机中能够有效地区分出汉字和西文。计算机分配存储的最基本单位是字节(8位),但是ASCII码通常为7位,因此存储时最高位通常为0。如果保证一个汉字存储在计算机中的每个字节最高位为1,那么显然就可以很方便地和ASCII字符区分出来。因此实现时,把GB2312—80中一个汉字区位码的区号和位号先分别转换为十六进制,然后再分别加上A0H,就得到该汉字的机内码。这样做的优点是很容易区分汉字与西文字符,缺点是实质上缩小了编码空间。根据前面的方法与公式,很容易能计算出“码”的机内码为C2EBH。
三.文本文件与二进制文件
文件是操作系统管理数据的有效手段,也是应用程序最常用的持久存储数据的方法之一。从文件的用途我们可以把文件分成:声音文件、动画文件、图片文件等。但就保存的文件格式而言,常把文件分为二进制文件和文本文件。
文本文件中只能存储字符,它在存储介质中存放每个字符对应的ASCII码或机内码,二进制文件可以存储各种二进制数据,如声音、视频等。数字567在文本文件的存储形式表示为“5”“6”“7”三个符号的ASCII,转换成二进制为:00110101 00110110 00110111,共3个字节。如果计算机中一个整型数据占两个字节,567在二进制文件中就保存为00000010 00110111,如果一个整型数据占四个字节,那么567在二进制文件中就保存为00000000 00000000 00000010 00110111。
Windows所附带的记事本编辑保存的文件属于文本文件。图片、声音、视频等在计算机内通常都是以二进制文件的形式保存,值得注意的是,Word、WPS等字处理软件编辑保存的默认的文件存储格式都属于二进制文件。
四、中文信息处理的发展
中文信息处理通常可以分为字符层和内容层两个处理层次。字符层主要解决中文的存储、输入、输出、处理等问题,经过大约几十年的探索与研究,这一层面的主要技术问题已经基本解决,研究也进展到实用阶段。“WPS”“汉王手写输入”“中文Office”等实用软件已经耳熟能详,给大家的工作、学习带来了诸多便利。内容层的研究目前刚刚起步,也取得了一些进展,并有了一些实用产品,例如,搜索引擎给网络检索带来很多便利,垃圾邮件过滤系统能帮助大家去除骚扰邮件,但这些层面的应用离实用和完美还有很大的距离。
Unicode的推进与普及有效地解决了中文的跨地区存储问题;语音识别、手写识别、键盘编码输入可以非常好地满足不同用户的输入需求;大多数计算机操作系统从内核上对中文提供了支持;在各种显示和打印设备上,已经可以得到非常精美的中文输出效果;Word、WPS等字处理软件已成为大家办公、生活的一部分;激光照排系统也已经给整个印刷业带来了革命性的变化。
内容层的中文信息处理应用前景非常广阔,常见的应用需求有:中文信息检索、中文信息分类、中文信息过滤、机器翻译、中文信息抽取、问答系统、中文情感分析等。但是它也有很大的难度,更加具有挑战性。随着互联网的日益发展,研究人员可以很容易地得到海量的真实语料,从而基于这些语料进行研究与拓展,因此目前基于内容层的信息处理很多是基于语料库的统计与挖掘,同时借助机器学习等手段进行处理。这实际上是一种“从大量已知的数据中抽取特征,然后根据这些特征对未知的数据进行判断的方法”。
机器翻译在处理一些真实句子时可能会得到文不对题的翻译结果,但我们不能因为一些极端的例子而否定内容层的研究。目前机器翻译在一些受限领域(如产品说明书翻译)取得了较好的效果,在一些场合也可以起到对人辅助翻译的作用。基于n-gram模型的汉字输入法在保持易用的前提下提高了汉字输入速度,中文科技文献检索已经具有较好的效果,中文搜索引擎也给信息爆炸的网络提供了查找数据的工具。但是也应该看到,这些领域可以提高与改善的空间还非常大。
实验原理
1.在记事本中输入字符后,可以选择以不同的编码保存。但文本文件最终还是以二进制的形式保存在计算机中,可以用二进制编辑器查看保存的文件,从而加深对字符编码的认识。
2.通过GB2312—80设计的区位码,可以唯一地确定每一个被收录的汉字,但如果汉字直接以区位码保存在计算机中却是不可行的,因为汉字的区位码可能会和西文的ASCII码混淆,所以要以机内码的形式存储汉字。
区位码通常用十进制表示,而汉字的机内码往往用十六进制表示,我们只需要把区位码的区号和位号分别变成十六进制,然后分别加上A0H,就可以得到该汉字的机内码。
3.文件的存储形式主要有文本文件和二进制文件。但由于计算机是基于二进制存储数据的,文本文件也可以用二进制的方式打开。
可以将同样的数据以文本形式和二进制形式保存,然后用十六进制编辑器打开文件查看,体会二者的区别。
文件操作的首要前提是打开文件,C语言中可以通过库函数中的fopen函数打开文件,文件使用完成后应该关闭文件,此时需要使用fclose库函数。
库函数中的fscanf和fprintf函数可以方便地读写文本文件,而使用fread函数和fwrite函数可以便捷地对二进制文件进行读写。
C++中提供了文件流的机制来对文件进行操作,主要有文件输入流(ifstream)、文件输出流(ofstream)和文件输入输出流(fstream)。它们都可以便捷地读写文本文件和二进制文件,具体细节可以参见相关书籍。
实验环境
一、操作系统
Windows2000以上版本,例如,Windows2000/XP/Vista/7/8/8.1/10等。
二、开发环境
Visual Studio6.0以上版本,例如,Visual Studio6.0/2003/2005/2008/2010/2012/2013等。
三、十六进制文件编辑器
例如,Ultra Edit、Winhex、Hex Workshop等。
实验步骤
一、查看自己姓名的内码
1.打开Windows附带的记事本。
2.在记事本中使用汉字输入法输入自己的学号与姓名。
3.单击【文件】→【保存】项,选择一个路径,以“name.txt”文件名保存该文件,在“另存为”对话框中“编码”项中选择“ANSI”,然后单击“保存”按钮。如图1.4所示。
图1.4 以ANSI编码保存文件
4.关闭记事本程序。
5.在资源管理器中切换到“name.txt”所在的文件夹,右击“name.txt”文件,单击【属性】项,根据对话框的信息记录下该文件大小。
6.用十六进制编辑器(如Ultra Edit软件)打开“name.txt”文件,记录下该文件的十六进制内容。
7.关闭十六进制编辑器。
8.在记事本中重新打开name.txt文件,单击【文件】→【另存为】项,输入文件名“name1.txt”,在“编码”项中选择“Unicode”,然后单击“保存”按钮。
9.用十六进制编辑器打开“name1.txt”文件,记录下该文件的内容。
10.仔细比较两次文件内容的区别,思考为什么同一字符以不同编码保存就不一样?
二、编写汉字区位码查看程序
1.在Visual C++集成环境中新建一个“Win32 Console Application”工程,工程的名称为“ex1_2”。图1.5是在Visual Studio 2010中建立Win32 Console Application项目的界面。
图1.5 在Visual Studio 2010中新建Win32 Console Application项目
2.在源程序编辑窗口编写代码,程序中定义一个具有三个元素的字符数组,然后接受用户输入一个汉字,接着将汉字的两个字节分别减去A0H,最后以十进制输出,就可以得到该汉字的区位码。将源程序书写到实验报告中。
3.运行程序,根据运行结果填写下表:
三、熟悉文件操作
1.在Visual C++集成环境中新建一个“Win32 Console Application”工程,工程的名称为“ex1_3”。
2.在程序编辑窗口输入程序,以文本方式创建文件“text.txt”和二进制方式创建文件“bin.dat”,产生10个1~100之间的随机正整数并分别写入这两个文件,其中文本文件中每个整数写一行。将程序填写在实验报告中。
提示:C和C++语言的库函数rand()可用于产生0~RANDMAX宏之间的一个随机整数。在程序前面添加#include<stdlib.h>后就可以使用该函数。函数原型如下:
int rand(void);
3.用十六进制编辑器打开两个文件,比较二者的区别,然后根据自己的理解在实验报告中描述产生区别的原因。
四、了解汉英翻译系统的进展
1.通过互联网查找一个或多个常用的汉英(英汉)翻译系统,并在实验报告中写出其名称。
2.有如下英文语句:He saw a duck with a telescope.。请根据你的理解,写出它可能的翻译。
3.写出你检索到的不同机器翻译系统对第2条中的句子的翻译结果。
4.自己组织一些句子测试你找到的机器翻译系统,并在实验报告中写出你对目前汉英(英汉)翻译系统的评价。
思考题
1.编写一个程序,实现GB2312—80汉字区位码到机内码的转换。
2.编写一个程序,实现用户输入GB2312—80的区号,输出该区所有的汉字。
3.编写一个程序,以二进制方式打开一个指定的文本,将文件中的数据顺序读出并写入另外一个文件中,从而实现文件复制的功能。
4.修改思考题3的程序,将读出的数据的每一个字节作一些变化,再写入另外一个文件中,从而实现简单的文件加密。
[1](美)Richard Johnsonbaugh,Martin Kalin著.ANSIC应用程序设计[M].杨季文,吕强,译.北京:清华大学出版社,2006.1.
[2]GB 2312—1980信息交换用汉字编码字符集—基本集 http://www.sac.gov.cn/SACSearch/search?channelid=97779&templet=gjcxjg_detail.jsp&searchword=STANDARD_CODE='GB2312-1980'&XZ=Q.
[3]GB 18030—2005信息技术中文编码字符集 http://www.sac.gov.cn/SACSearch/search?chan-nelid=97779&templet=gjcxjg_detail.jsp&searchword=STANDARD_CODE='GB18030-2005'&XZ=Q.
[4]GB 13000—2010信息技术通用多八位编码字符集(UCS) http://www.sac.gov.cn/SAC-Search/search?channelid=97779&templet=gjcxjg_detail.jsp&searchword=STANDARD_CODE='GB 13000-2010'&XZ=Q.
[5]刘群.统计机器翻译综述[J].中文信息学报,2003,17(4):1-12.
[6]王继成,萧嵘,孙正兴,等.Web信息检索研究进展[J].计算机研究与发展,2001,02:187-193.
[7]马亮,陈群秀,蔡莲红.一种改进的自适应文本信息过滤模型[J].计算机研究与发展,2005,01:79-84.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。