我的本科毕业设计(非水文,设计了一个新算法):一种字符编码猜测工具的实现方法

摘要

自从进入计算机时代后,人们创造了许多编码,来表示各国的语言文字。这些编码从一开始设计时,就没有考虑到要和其它编码兼容,它们只是为某个国家或某种语言来服务的。

随着Internet的发展,各国间的联系更加紧密,出现在人们视野中的不再是单纯某个国家的文字,越来越多其他国家的文字出现在了本地的计算机上。再加上由于历史原因,即使是一个国家的文字,都可能会以多种编码形式出现。虽然,一种统一的编码Unicode流行起来了,并成为了发展趋势,但在目前的环境中,仍然存在着其他各种编码。这样,本地的计算机上就需要处理许多种的编码。

以错误的编码打开一个文本会导致乱码,人们需要知道文本具体的编码信息。人们需要手动选择各种编码,直到能够正确显示文本为止,这是个痛苦的过程。字符编码猜测工具能使人们从这种繁琐的过程中解脱出来。

现在已经有了一些字符编码猜测工具了,如IEMozilla都有这种功能。本文提出了另一种实现该工具的方法,实践证明,该方法具有很高的可靠性,效率也很高,并且简单易懂,可扩展。

识别语言种类是该工具的另一个副产品,目前上述两种浏览器提供了部分功能。本文提出的方法,能够猜测出更详细的语言信息,例如ISO-8859-1UTF-8的语言信息。

 

关键字:

全球化,本地化,字符编码,编码猜测


Abstract

Since the beginning of the computer age, many encoding schemes have been created to represent various writing scripts/characters for computerized data. With the advent of globalization and the development of the Internet, information exchanges crossing both language and regional boundaries are becoming ever more important. But the existence of multiple coding schemes presents a significant barrier. The Unicode has provided a universal coding scheme, but it has not so far replaced existing regional coding schemes for a variety of reasons. Thus, today's global software applications are required to handle multiple encodings in addition to supporting Unicode.

The text can not be shown correctly if we open it with wrong encoding. It takes pains to choose all the encoding till the text is shown correctly. The encoding detection tool can help us.

Such tools exist in some browser like Mozilla and IE. This article is about a new and simple way to implement the tool. It is proved to be stable, efficient and extendable.

One additional function provided by this tool is to guess the language of the text. It can show the language information in more detail than Mozilla and IE. For example: language information for encoding UTF-8 and ISO-8859-1.

 

Keywords

Globalization, Localization, Charset, Encoding detection


目录

摘要... I

Abstract II

第一章 引言... 1

1.1 背景... 1

1.2 论文的主要工作... 2

1.3 论文的组织... 2

第二章 各种编码介绍... 3

2.1 ASCII... 3

2.2 ISO-8859系列... 3

2.3 ISO-2022系列... 4

2.3.1 ISO-2022-CN.. 5

2.3.2 ISO-2022-JP. 6

2.3.3 ISO-2022-KR. 7

2.4 Unicode. 7

2.4.1 简介... 7

2.4.2 UTF-16. 8

2.4.3 UTF-8. 9

2.4.4 UTF-32. 10

2.5 本章小结... 10

第三章 Mozilla字符编码猜测实现方法... 11

3.1 编码模式方法... 11

3.2 字符分布方法(Character Distribute... 11

3.3 双字符序列分布方法(2-Char Sequence Distribute... 12

3.4 复合方法... 12

3.5 本章小结... 13

第四章 字符编码猜测实现... 14

4.1 理论背景... 14

4.2 噪声数据... 14

4.3 主要算法... 15

4.4 实现方法概要... 16

4.5 样本的获得... 17

4.6 可行性分析... 18

4.7 Mozilla的比较... 22

4.7.1 功能... 22

4.7.2准确率... 23

4.7.3 效率与复杂性... 23

4.7.4 扩展性... 24

4.8 本章小结... 24

第五章 总结与展望... 25

参考文献... 26

致谢... 27

附录:部分域名国家(地区)对照表... 28

 


第一章 引言

1.1 背景

自从进入计算机时代以来,人们创造了许多使用计算机数据表示的编码方案来表达不同的文字/字符集。随着全球化和Internet的发展,跨语言和区域的信息交换越来越重要。但是现存的多种编码方案对此是一个屏障。Unicode提供了通用的编码解决方案,但是,迄今为止,各种各样的因素使它并没有代替现存的区域编码方案。除了W 3C IETF建议使用UTF-8作为缺省编码,比如XMLXHTMLRDF。因此,现今的国际化软件不仅要处理Unicode编码,还要处理其它多种不同的编码方式[1]

以错误的编码打开一个文本会导致乱码的出现,人们需要知道文本具体的编码信息。网络上传播的HTML文件有时会通过标签指定编码,但这不是必需的,在实际情况中,能找到大量不带编码信息的HTML文件。即使是带有编码信息的HTML文件,也有可能因书写的错误,导致了错误的编码信息。

一种低效但是可行的方法是,可以逐个以每种编码来打开文本,直到能正常显示文本,不出现乱码为止。但人们会厌倦这种方法,因为那需要花费大量的时间。

一个自动猜测字符编码的工具能够把人们从这种琐碎的工作中解救出来,它能够自动猜测文本的编码形式,从而正确地显示文本。

看起来有些不可思议,但目前确实有了一些已经实现的工具,如IEMozilla等浏览器。它们提供一个自动选择编码的菜单,当遇到一个未指定编码的HTML文件时,便会自动调用这个工具,得出最可能的编码,然后正确显示网页。

之所以能实现这样的工具,是因为文本中会包含很多的编码信息,一些数据会在某些编码中经常出现,而有些则永远不会出现。还有一些编码会有一些标记的符号(字符序列),如UTFBOM(字节顺序标记),ISO-2022ESC序列,通过这些标记,能够准确地定位到该编码。

本文提供了实现这种工具的另一个方法,实践证明,该方法具有很高的可靠性,效率也很高,并且简单易懂,可扩展。

1.2 论文的主要工作

本论文从讨论各种编码的内部原理开始,从中找出猜测一部分编码可用的方法。如ISO-2022编码特殊的ESC序列,UTFBOM,这些可以作为判断该种编码的一个依据。在分析各种编码中,可以看出大部分编码ASCII 0-127部分的代码点相同,这样可以去除一部分噪声数据。

接下来介绍了Mozilla字符编码猜测工具的实现。这样就能了解到其他工具是如何实现的,通过比较,可以看出本文实现的优越性以及不足,从而为他人选择本文实现作为一个依据。

最重要的部分,详细介绍了本实现。介绍了算法组间方差以及组间差,以及实现方法的概要。重点是放在可行性分析上,要让人们知道这个方法确实行的通,需要有大量的数据来说明。该 部分会有许多试验数据组成的表,来说明该方法是可靠的。最后,通过与Mozilla实现的比较,说明了该方法的优越性。

1.3 论文的组织

第一章:简要字符编码猜测工具出现的背景,以及实现该工具的可行性并介绍了作者的工作和论文的结构。

第二章:简单介绍了各种编码,包括ASCII码,ISO-2022编码,Unicode编码。

第三章:介绍了Mozilla实现字符编码猜测工具的方法。

第四章:详细介绍了作者提出的实现方法,包括主要算法,实现的方法要点。还给出了该方法的可信性分析,以实验数据说明该方法具有很高的可靠性。最后比较了本文实现和Mozilla的实现,从中可以看出本文实现的优越性。


第二章 各种编码介绍

2.1 ASCII

ASCIIAmerican Standard Code for Information Interchange),它的全称是“美国信息交换标准代码”。每个ASCII码以1个字节(Byte)储存,从0到数字127代表不同的常用符号,例如大 AASCII码是65,小写a则是97。由于ASCII字节的七个位,最高位并不使用,所以后来又将最高的一个位也编入这套内码中,成为八个位的延伸 ASCIIExtended ASCII)码,这套内码加上了许多外文和表格等特殊符号,成为目前常用的内码[2]

2.2 ISO-8859系列

ISO-8859字符集系列上世纪80年代中期由欧洲制造商协会(ECMA)设计并被ISO所接受,是一整套关于字母语言的8位图形字符集,现已有至少15种字符集存在该系列中。下面列举了其中10种,并指出了其对应的地区或语言[3]

2-1 字符集语言对应表

字符集名称

语系

语言或国家

ISO-8859-1

拉丁1(西欧)

法语,西班牙语,葡萄牙语,意大利语,德语,荷兰语,丹麦语,瑞典语,挪威语,英语,爱尔兰语,斯瓦西里语,班图语...

ISO-8859-2

拉丁2(东欧)

捷克语,匈牙利语,波兰语,罗马尼亚语,克罗地亚语,斯洛伐克语...

ISO-8859-3

拉丁3(南欧)

世界语,马耳他语,土耳其语...

ISO-8859-4

拉丁4(北欧)

格陵兰语,拉普兰语,爱沙尼亚语,拉脱维亚语,立陶宛语...

ISO-8859-5

斯拉夫语

保加利亚语,俄语,马其顿语,塞尔维亚语,乌克兰语...

ISO-8859-6

阿拉伯语

阿拉伯语...

ISO-8859-7

希腊语

希腊语...

ISO-8859-8

希伯来语

希伯来语,依地语...

ISO-8859-9

拉丁5(土耳其)

土耳其语..(用一些土耳其字符代替拉丁1中很少使用的冰岛字符).

ISO-8859-10

拉丁6(北欧Nordic

整个北欧地区...(重新组织了拉丁4)

注意:

1.        一个字符集可能用于多个地区,如ISO-8859-1,可以用于西欧,也可用于澳洲,北美等地区。

2.        一种语言不一定只能被一种编码表示,如拉丁1到拉丁6都能表示德语。

每个字符集有256个字符,其中0-127部分与扩展ASCII码对应部分相同,128-159是一些很少被使用的控制字符,在ISO 6429中被称为C1集。区别在于160-255部分。下图为ISO-8859编码的结构图。

 0                                128     160                          255

ASCII

C1

区别部分

2-1 ISO-8859编码结构图

2-2和图2-3列举了2种字符集160-225部分的字符。

2-2 ISO-8859-1(拉丁1

2-3 ISO-8859-7(希腊)

2.3 ISO-2022系列

对于像中文,日文,韩文这样的文字,无法只用8位来表示所有的字符。ISO 2022提供了这样一种技术,它能在一种字符编码中支持多种字符集,可以用8位或16位来表示一个文字(字符),是一种变长的编码,这样,就能表示所有的上述东亚字符了。该编码还有个显著的特点,就是所有的字节都是以0开始(ASCII0-127部分),有效位数是7,所以在网络传输中,可以只传7位。但同时出现了一个问题,如何区分哪些是ACSII部分的字符,哪些是东亚字符?ISO 2022用到的是标号(designations )和变换函数(shift functions)。

标号又称ESC序列(escape sequence),是一串以ASCIIESCox1B)开头的字符串,特定的字符串指明所用的字符集。

变换函数指明以何种方式解释接下来的字符,包括以何种字符集解释,解释多长的字节(接下来的两个字节或所有新的变换出现前的字节)。

下面介绍一下ISO-2022-CN(中文),ISO-2022-JP(日文),以及ISO-2022-KR(韩文)的实现方式。

2.3.1 ISO-2022-CN

ISO-2022-CN3种标号:SO标号,SS2标号和SS3 标号(SS3只出现于ISO-2022-CN-EXT中)。SO标号的形式是ESC $ ) <F>,其中<F>表示终结字符,由ISO指定。SS2标号的形式是ESC $ * <F>SS3标号的形式是ESC $ + <F>。新出现的同种标号会覆盖前面的标号,如SO标号ESC $ ) A可以覆盖之前出现的SO标号ESC $ ) G,接下来的出现在SO变换后的字符将由新的SO标号指定的字符集来解码。

ISO-2022-CN4种变换:SISOSS2SS3SS3变换只出现于ISO-2022-CN-EXT中)。

SI变换由一个字节ox 0F 指定,表明后面的字节都应该解释为ASCII,直到遇到另一个变换。文本以SI为默认的变换,没有出现其它SI变换时,所有字节都将被解释为ASCII,即文本以ACSII字符开头。对于文本的每一行,若有汉字字符存在,一定要指定一个SO标号,即上一行指定的标号在本行不起作用。在行结束之前,一定要变换到ASCIISI),当然若本行不含汉字字符,就不需要这样的变换了,整个一行都是ASCII字符(关于ISO-2022-CN的形式语法,详见RFC 1922 7.1节)[5]

SO变换由一个字节ox0E指定,表明接下来的字节由SO标号指定的字符集来解释。

SS2变换由两个字节ox1B4E指定,表明接下来两个字节由SS2标号指定的字符集来解释,之后的字节又将由之前定义的变换来解释(SISO)。

SS3变换由两个字节ox1B 4F 指定,表明接下来两个字节由SS3标号指定的字符集来解释,之后的字节又将由之前定义的变换来解释(SISO)。

该编码支持的字符集有ASCIIGB2312CNS 11643-plane-1CNS 11643-plane-2

ISO-2022-CN所用的标号,变换函数,以及支持的字符集如表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值