BIG5到GB的转换技术
5 C. @$ x4 i) M3 l
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
5 l! |4 C$ ?7 f。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
/ P/ w# N: K8 N# K; A汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5
$ }) k v5 g8 P) Q) O7 ^; E码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个
BIG5编码对应GB编码的码表文件。
2 _7 Z% Q, S8 ]- C- o/ E第一步 制作码表文件
" I( L/ d" }: W! _, \5 y5 w% }BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
4 c: C5 S# t* ]% ?0 y8 A$ X1 d3 |6 Z; C0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
( Y' {) ^% O2 q% H范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
& n* H# F' V Y6 [* p制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
) d1 R9 }4 r6 |& F8 h5 j5 n,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
文件转换为GB码文件,即得到码表文件。
8 z9 W4 `0 b( D$ v( N w' P( j4 R下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.
TXT”。
1 n9 O' H! i. r# ? L//TURBO C++ 3.0
#include <Stdio.h>
#include <stdlib.h>
6 v# d' Z1 j4 W L1 Zvoid main(){
FILE * codefile;
2 R* e( e# u6 Y% Y4 b' D# Qint i,j,k;
codefile=fopen("table.txt","w+b");
% v4 t+ X+ W) V0 }1 [. X! Efor (i=0xa1;i<=0xfe;I++){
for(j=0x00;j<=0xff;j++){
fwrite(& i,1,1,codefile);
fwrite(& j,1,1,codefile);}
}
fclose(codefile);
/ \/ q, K) n* K0 {* P% T' {9 K* Freturn;
}
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
即获得码表文件。
第二步 转换
下面的源程序,将BIG5码文件转换为GB码文件。
//TURBO C++3.0
, |( l" u7 ~$ E) H. A+ f9 I2 H#include <stdio.h>
, k L" Q2 X# r0 C! t- K. n; K' \" s#include <stdlib.h>
void main(){
0 T x6 D5 N& ~6 b9 nint que, wei;
6 A2 W2 C7 N1 c- KFILE * sourcefile;
. E3 U# |: E* N3 n. lFILE * tabfile;
3 _9 C2 g$ g" Z! z: h3 b5 ~* cFILE * destfile;
1 u- z% G8 {( q5 x, Y- b& t( a8 @sourcefile = fopen("big.txt', "r+b");
//BIG5 码文件
tabfile = fopen("table.txt", 'r+b");
) C' K8 C( G9 T% P* W4 f( w b5 X//码表文件
6 i% \" H. z$ J% x9 L5 j0 Xdestfile = fopen("gb.txt","w+b");
//转换生成的GB码文件
" p; Q6 J6 A" W; cwhile (!feof(sourcefile)){
4 {8 E* ], ~6 |# @* D% Tfread(& que,1,1,sourcefile);
, ?; n+ T4 i3 o+ iif (feof(sourcefile)){
. b- e- G9 ^$ M5 {6 L0 i! }& {! s6 \break; }
, C4 E7 ~' h4 { @5 cif (que> =0xa1 && que <=0xfe)
//叛断是否汉字(BIG5编码)
{fread(& wei,1,1,sourcefile);
if (wei<0xa1) wei = wei - 0x40;
' R) {" C' b& X3 Z, `+ Y& F, C+ a' jif (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1;
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
+ wei), SEEK_SET);
; n5 H% A) A! ^4 K5 o6 [5 Ffread(& que,1,1,tabfile);
0 x x# F/ B; v7 x. J" w; O0 _2 kfread(& wei,1,1,tabfile);
; G4 M6 Z- E: H' `0 X% x+ l" tfwrite(& que,1,1,destfile);
$ }' K8 r6 K3 j1 j3 T, zfwrite(& wei,1,1,destfile);
}
else
fwrite(& que,1,1,destfile); //处理英文
; ^2 K1 T3 G; y( p}
/ X; [% `; d4 z7 K% E2 ofclose(sourcefile);
fclose(tabfile);
fclose(destfile);
9 j5 h! \: H: e0 j' b* Yreturn;
; Z' J( f4 C/ V- m+ _, g! W2 M: ^}
3 X. j2 G6 l- y+ X4 ]8 [" z. F以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
同样的方法,我们也可以将GB码转换为BIG5码。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |