一种适用于宽字符集文档的压缩方法
本发明涉及一种文档压缩方法,适用于对宽字符集文档进行压缩。
近年来,由于电子科技的日新月异,各种信息在这电脑科技时代里,迅速流动,数据量亦随之快速成长。日常生活中,人们似必需随时依赖电脑,处理和交换大量的各类信息,电脑俨然已成为现代人生活与工作中,一种不可或缺的重要工具,高科技电子产业亦因此正以难以估量的速度发展。
随着人们对便捷性需求的提升,携带方便且易于操作的笔记本型电脑及掌上型信息装置,对经常需处理大量信息的人们而言,自然极获青睐。而在今日众多科技电子产品里,拥有庞大的潜在消费群,随着信息量的不断增加,如何在现有装置的有限储存容量下,提供更多的信息,已成为大多数电脑消费者的共同需求与期望。
目前,在笔记本型电脑及掌上型信息装置上,Windows Ntey Window CE等操作系统,大抵都使用UNICODE(宽字符集)规范的格式,进行文档的编码。因此,如何对这些文档进行更有效的压缩,以在有限的储存容量下,储存更多的信息,即显得非常重要。按,已知的压缩与解压缩的运算法有很多种,如:LZSS、HUFFMAN等运算法,但,这些已知运算法均存在着若干缺点:
(1)LZSS运算法:其基本工作原理是利用一种滑动窗的压缩方法,藉保留最近处理过的n个字元,并在该n个字元中匹配其后要编码的字元,若找到匹配的字元串,则将该匹配部分编码成固定长度的位置长度码,否则,以原码输出。这种LZSS运算法,对于数据中重复字元的编码,虽有较佳的效率,但对于码值分布较均匀的数据,其编码效率则不尽理想,且在解压缩时,需较大的储存空间,故浪费资源的情形较为严重。
(2)HUFFMAN运算法:参见图1所示,该运算法利用可变长度的编码,来表示出现频率不同的字符,并藉先统计出文档中所有字符的出现频率,再根据字符出现的概率分布,对所有字符统一编码,从而令出现频率较高的字符拥有较短的编码,令频率较低的字符拥有较长的编码,据以达到文档压缩的目的。
该HUFFMAN运算法的基本作法,以一欲进行压缩的数据文件中的字符集D={d1,d2,…,dn}为例,是对各字符di的出现次数Wi进行记录,并以Wi为权值,建造一HUFFMAN树图,且将该树图中从根到每个字符di的唯一路径记为Pi,并约定每级左路径为0,右路径为1,如此,选取每个Pi路径上的0,1…,值,即为di的HUFFMAN编码。
例如:一字符集“banan”共有三个字符,“b”、“a”及“n”,分别出现1、2、2次,则所建立的HUFFMAN树图将如图2所示,其中:
字符b的HUFFMAN编码为:00
字符a的HUFFMAN编码为:01
字符n的HUFFMAN编码为:1
故该字符集“banan”可以00011011的数据编码,予以表示。
由前例可知,该HUFFMAN运算法的最大编码长度取决于HUFFMAN树图中的节点数量,意即节点愈少,编码愈短,故若能有效减少其节点数量,应即能大幅提升文档的压缩率。然而,此种已知的HUFFMAN运算法却仍存在下列缺陷:
(1)由于,中文之字符码值范围(0x00-0xFF)比较广,概率分布亦较分散,令HUFFMAN树图所产生的节点较多,致使该运算法对中文字符,将产生平均长度较长的编码,故其对中文字符的压缩率较差。
(2)该运算法不区分中、英文字符,而是将二者统一编码,致使英文字符的HUFFMAN编码,将因英文字符的码值比较集中,而受中文字符的影响,令其编码效率大幅降低。
有鉴于前述已知LZSS及HUFFMAN等运算法,在对文档进行压缩处埋时仍存在诸多缺点,致使已知运算法无法满足电脑消费者对高储存能力的共同要求。本发明乃利用降低HUFFMAN树图中节点的方式,将UNICODE文档的中、英文字符分别编码,并依LZSS运算法对英文字符处理的方式,忽略重复的高字元0x00,并在每段英文之前及每段中文之前,分别加入一个不会与文档数据冲突的额外标记,以区分中、英文字符,而对中文字符则采用自订的规则,对其重新编码,依字符中高、低字元的顺序及其出现的概率,分别建立对应编码表,并据以进行压缩,大幅提高文档的压缩率。
本发明的目的是对于中文字符进行重新编码,令其码值集中分布,解决因中文字符码值范围分布较分散的问题,避免产生较长的平均编码长度,故可有效提升对中文字符的压缩率。
本发明的另一目的是同时将中、英文字符分别编码,即分别统计中、英文字符的个数,再根据高、低字元的顺序,分别统计字元出现概率,并据以分别编码,以有效提升对中、英文字符的压缩率。
本发明的又一目的是针对传统HUFFMAN压缩方法的缺陷,利用UNICODE及HUFFMAN运算法的特点进行改良,发明出之一种适用于宽字符集(UNICODE)文件的压缩方法,主要是利用对中、英文字符分别建立HUFFMAN树图,并藉对中文字符按自订的规则,先进行重新编码,以减少HUFFMAN树图的节点数,令编码缩短,提高压缩率。
图1为传统HUFFMAN运算法的流程示意图;
图2为字符集“banan”所建立的HUFFMAN树图的示意图;
图3为本发明的流程示意图;
图4为本发明的中文字符重新编码及换码示意图;
图5为利用本发明的实施例所建立的HUFFMAN树图的示意图;
图6为利用传统HUFFMAN运算法所建立的HUFFMAN树图的示意图;
图7为利用本发明及传统HUFFMAN运算法所建立的HUFFMAN树图的比较示意图。
UNICODE文档的特征是利用16Bits(2字节)表示一个英文字符,但其高字元均为0x00,且在UNICODE文档中,大多数情况下都是以一段英文、一段中文方式交替出现。
本发明是一种适用于宽字符集(UNICODE)文档的压缩方法,请参见图3所示,该压缩方法对于英文字符,是利用LZSS运算法在处理重复字元的编码上较佳的处理能力,令其对UNICODE文档进行压缩时,不压缩每一英文字符中重覆的高字元0x00,而在每段英文之前及每段中文之前,加入两个不会与文档数据冲突的额外标记(均为1字),用以区分中、英文字符,同时,将该标记作为待压缩信息,在后续压缩程序中,一并予以压缩,如此,即可大幅提高对英文字符的压缩率。
例如:在文档数据中的每段英文前加入0xFD,而在每段中文之前加入0xFE,当对文档资料进行压缩时,可将其作为待压缩信息,压缩入文档资料中,在解压缩时,若解出标记0xFD,则表示其后为英文字符,若解出标记0xFE,则表示其后为中文字符,对于英文字符,先解压缩出英文字符的低字元后,再将其高字元设为0x00。
本发明中对于中文字符的编解码,是以如何降低HUFFMAN树图的节点数,作为考虑的依据,其编码方式主要可分下列二步骤:
(一)本发明先统计出UNICODE文档中不同中文字符的个数,再根据所统计出的各该中文字符的出现顺序,依自订的规则,对这些中文字符进行重新编码,并建立一依中文字符出现顺序排列的中文UNICODE码值转换表,例如:对于字符集“huffman压缩算法压缩”,其UNICODE码值转换表将如下表所示,其长度为4*2=8字节:
序号 |
项目 |
1(压) |
0x58D3 |
2(缩) |
0x7E2E |
3(算) |
0x7B97 |
4(法) |
0x6CD5 |
该表的长度较小,其中项目栏为相应中文字符的UNICODE码值,项目拦的个数为不同中文字符的个数,序号乃项目栏所代表的中文字符在文档中出现的顺序,依次排列。
当文档中有8000个中文字符时,该表长度可为16k字节,相对于几百KB的文档,则可忽略不记。当文档中有2000~8000个中文字符时,中文字符编码的码值,按本发明的自订编码规则计算,应在0x01~0x65之间,令HUFFMAN树图的节点数由最多512个可减少到100~200个左右,从而使HUFFMAN编码的平均长度达到最短,本发明即利用此一方式,大幅提高对中文字符的压缩率。
(二)其次,由于中文字符编码的特性,其低字元码值范围为0x00~0xFF,而高字元码值范围则相对较小。因此,本发明在压缩中、英文字符时,藉针对中、英文字符的高、低字元分别建立HUFFMAN树图,即按照低字元在前、高字元在后的顺序,建立HUFFMAN树图,并根据这些HUFFMAN树图分别建立中、英文字符的编码对应表,以使该文档的中、英文字符依该编码对应表完成编码及压缩程序,如此,不仅可有效减少中、英文字符在HUFFMAN树图中的节点数量,其高字元的编码效率亦不受低字元的影响,故可有效提高对中、英文字符的压缩率。
本发明在对英文字符进行解压缩时,是先解压缩出英文字符的低字元,再将其高字元设为0x00,在对中文字符进行解压缩时,其码值则根据解压缩的编码,在该中文字符的码值转换表中,藉由查表求得。
为能更清楚表达本发明的技术构思,特举一最佳实施例,就本发明针对宽字符集(UNICODE)文档中的中、英文字符,进行压缩及解压缩的过程中的各步骤,详细说明如下,请参见图3所示:
(1)首先,本发明统计出UNICODE文档中不同字符的个数;
(2)再依本发明自订的编码规则,对所有中文字符进行重新编码;
在本发明的最佳实施例中,自订的编码规则主要有二:
A)采用2字节的编码方式,如此,将不致改变原文档的数据长度;
B)其码值范围是以文档中不同码值的中文字符的总个数的平方根加1,而起始码值可在0x00~0xFF之间任选,但须满足下列条件:
结束码值-起始码值>不同中文字符个数的平方根+1
例如:假设UNICODE文档中有20个不同的中文字符,编码的起始码设为0x01,则根据前述规则√20+1≈0x05,其结束码为0x05,且中文字符的对应码值表,请参见图4所示。如此,在编码前,由于中文字符均为2字节,码值最多为20*2=40个,根据HUFFMAN树图的特性,HUFFMAN的节点数为2*40-1=79个,编码后,因码值变为0x01-0x05=5个,使得HUFFMAN的节点数由79个减少到2*5-1=9个,并令HUFFMAN编码的平均长度达到最短,故大幅提高了HUFFMAN运算法对中文字符的压缩率。
(3)将原UNICODE文档中的中文字符,依前述自订的编码规则,建立一中文字符的码值转换表,并根据该表将其转换成对应的编码;
(4)完成前述对应编码的转换后,再依中、英文字符出现的次数及低字元在前、高字元在后的顺序,分别建立一HUFFMAN树图,并根据该HUFFMAN树图分别建立中、英文字符的编码对应表,使该文档的中、英文字符依该编码对应表完成编码及压缩程序;
(5)本发明针对前述编码进行解压缩时,亦是依照前述低字元在前、高字元在后的顺序,进行解压缩,嗣,再则根据所解压缩出的编码,在前述中文字符的码值转换表中,藉由查表求得该字符的码值。
例如:字符集“huffman压缩算法压缩”对应的UNICODE码值为:
h |
u |
f |
f |
m |
a |
n |
压 |
缩 |
算 |
法 |
压 |
缩 |
6800 |
75900 |
6600 |
6600 |
6D00 |
6100 |
6E00 |
D358 |
2E7E |
977B |
D56C |
D358 |
2E7E |
在本发明对其进行压缩时,其处理过程及结果如下:
(1)首先,本发明将统计该字符集中不同的中文字符的个数,分别为“压”、“缩”、“算”及“法”等四个;
(2)再按自订的规则为其编码,在本发明的最佳实施例中,该自订的编码规则,是将其编码的起始码设为0x01,结束码设为√4+1=0x03,得到如下所示的该字符集中各不同出现顺序的中文字符的码值转换表:
缩 |
0x0102 |
算 |
0x0103 |
法 |
0x0201 |
(3)将原UNICODE的中文字符,依前述自订的编码规则,转换成其对应的编码:
FD 68 75 66 66 6D 61 6E 20 FE 01 01 01 02 01 03 02 01 01 01 01 02
本发明在对于英文字符进行压缩时,不压缩高字元0x00,而是在每段英文之前加入0xFD,而在每段中文之前加入0xFE,用以区分中、英文字符,在压缩时,可将其作为待压缩信息,压缩入文档数据中,故FD、FE为额外加入的标记,FD之后为英文,FE之后为中文。
(4)完成前述对应编码的转换后,本发明再依中文字符中的低字元在前、高字元在后的顺序,分别统计各ASCII字符出现的次数,并据以建立HUFFMAN树图,请参见图5所示;
(5)最后,再根据HUFFMAN树图,分别对各字符建立一中、英文字符的编码对应表,使该文档的中、英文字符依该编码对应表完成编码及压缩程序。
各ASCII字符的编码对应表如下:(编码以bit表示)
20 |
101 |
61 |
1001 |
66 |
00 |
68 |
010 |
6D |
1000 |
6E |
110 |
英文字符编码 中文字符编码
则该字符可以用ASCII字符表示为:
111 010 111 00 00 1000 1001 110 101 011 0 0 0 10 0110 10 0 0 0 0 10
即:EB 84 4E AC 4D 04
反之,若以传统的HUFFMAN运算法对该字符集”huffman压缩算法压缩“进行压缩时,其过程及结果如下:
(1)统计各ASCII字符出现的次数,并建立HUFFMAN树图,请参见图6所示:
(2)根据HUFFMAN树图,对各ASCII字符编码,并产生如下的ASCII字符编码
对应表如下(编码以bit表示):
00 |
11 |
20 |
00111 |
2E |
100 |
58 |
0111 |
61 |
00101 |
66 |
0000 |
68 |
00010 |
6C |
01011 |
6D |
00100 |
6E |
0011 |
|
0 |
75 |
00011 |
7B |
01001 |
7E |
101 |
97 |
01000 |
D3 |
0110 |
D5 |
01010 |
则该字符集可以用ASCII字符表示为:
00010 11 00011 11 0000 11 0000 11 00100 11 00101 1100110 11 00111 11 0110 0111 100 101 01000 01001 01010 010110110 0111 100 101
即:
16 3C 30 C9 97 36 70 9E 54 25 4B 67 94
由以上所述可知,本发明的压缩方法与传统HUFFMAN的运算法对于一长度为28字节的字符集,在进行压缩及编码时,彼此间的优劣比较,请参见图7所示,将如下表所示:
|
传统算法 |
本发明算法 |
HUFFMAN节点数 |
31 |
英文树15中文树7共12+7=22 |
编码后字符集长度 |
13字节 |
6字节 |
节点数比较 |
多 |
少 |
编码效率比较 |
(13-6)/13≈53.8% |
显然本发明的压缩方法较诸传统方法可有效减少HUFFMAN树图的节点数,令编码缩短,大幅提高其压缩率。
以上所述,仅为本发明的较佳实施例,但本发明所主张的权利范围,并不局限于此,凡熟悉本技术者,依据本发明所揭示的技术内容,可轻易思及的等效变化,均应属不脱离本发明的保护范畴。