BIG5到GB的转换技术
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
. _' ~; X, I, W1 B& k; J。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就
$ ^0 l6 k i8 F+ m H可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
. M* e2 f! m' j9 B; b, i* j汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
0 Y# }" d& [+ k! G7 u- M% H汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5
码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
# G2 Q, t) U* ~1 `) q% j(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个
BIG5编码对应GB编码的码表文件。
) ?& @* c) @5 ^' _$ X8 {* ~; J! X第一步 制作码表文件
1 z$ ?/ y5 k+ a+ K3 BBIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
. @; _9 t5 B" G( J# j, ?; T( W0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
; \ S) w9 y# a: c157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
& P* s. _+ y. |8 W* C! y7 s字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
8 g8 a/ }0 L3 ^制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
文件转换为GB码文件,即得到码表文件。
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.
! b, K6 x1 Q. m. rTXT”。
//TURBO C++ 3.0
#include <Stdio.h>
#include <stdlib.h>
$ O) ^6 V: O0 nvoid main(){
FILE * codefile;
int i,j,k;
codefile=fopen("table.txt","w+b");
' N* N2 K8 w( N8 D2 ^; _- A- `for (i=0xa1;i<=0xfe;I++){
! |8 c7 ^2 Y E) bfor(j=0x00;j<=0xff;j++){
+ h, ]; D Q0 X, j( K. g& ifwrite(& i,1,1,codefile);
0 E+ p# L3 L" @. v# V' {6 pfwrite(& j,1,1,codefile);}
}
fclose(codefile);
8 K, i8 ~) i( F7 J1 Yreturn;
/ l! z: Z7 k' u- r: Y7 v- Y}
" a. F+ U- A; Y' J9 R2 F运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
. l( l9 _% m6 v z9 f* `即获得码表文件。
第二步 转换
1 l, q' h2 b( N2 h下面的源程序,将BIG5码文件转换为GB码文件。
. t* R/ d4 W4 l3 M% q9 p) n- \//TURBO C++3.0
#include <stdio.h>
#include <stdlib.h>
$ L! S( n0 B$ k- Svoid main(){
int que, wei;
! ]+ z6 m! p0 A- }1 F" q1 F; H8 w6 v, JFILE * sourcefile;
FILE * tabfile;
1 l- D" a" p0 oFILE * destfile;
8 \7 {. S' c6 ~# @6 y" usourcefile = fopen("big.txt', "r+b");
//BIG5 码文件
7 `, ]6 ?; R# U) w! i, [$ Dtabfile = fopen("table.txt", 'r+b");
//码表文件
7 B( j8 [: K/ E! pdestfile = fopen("gb.txt","w+b");
//转换生成的GB码文件
while (!feof(sourcefile)){
fread(& que,1,1,sourcefile);
if (feof(sourcefile)){
/ R9 o! Q$ m( [5 f8 {- f/ Cbreak; }
! L/ @1 ~2 v! p7 s$ o* [9 ^if (que> =0xa1 && que <=0xfe)
! L8 Q+ l/ w3 Y' ?: u//叛断是否汉字(BIG5编码)
8 w0 e4 C+ x7 j5 I% p/ H6 ^7 `{fread(& wei,1,1,sourcefile);
1 g4 W9 k* O( B6 T$ |4 {if (wei<0xa1) wei = wei - 0x40;
if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1;
9 A9 z% t( m2 A6 ~fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
+ wei), SEEK_SET);
( h: R# e3 n- yfread(& que,1,1,tabfile);
4 s/ v/ Z6 X0 Z) B' Gfread(& wei,1,1,tabfile);
4 ~4 C' W! Z- b3 J( w: ^fwrite(& que,1,1,destfile);
. K Z: b; }) ]( |( pfwrite(& wei,1,1,destfile);
% e2 f4 z- d' H7 `6 @* D& C}
else
5 |! A! _( M5 h7 _8 efwrite(& que,1,1,destfile); //处理英文
}
4 j- t9 R# B) b5 j( \fclose(sourcefile);
' I6 e2 O; w& T) ~fclose(tabfile);
K$ r( r* N( `$ Efclose(destfile);
return;
}
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
; ~* l$ ~" j$ d) k7 G6 w同样的方法,我们也可以将GB码转换为BIG5码。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |