BIG5到GB的转换技术
& p& f x3 Y, n
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
* O8 n5 ?! H* x6 t9 x6 Y0 y来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
8 C- \+ \; Y( D7 N* x7 q。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
5 v6 n+ Q& H t9 a- B, N$ y2 T汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5
4 R! F5 Q9 ?6 l8 J: l! r) r码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个
BIG5编码对应GB编码的码表文件。
第一步 制作码表文件
0 _ W ]2 h2 j" s2 y. d* E/ ^BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
3 ]" M" K7 x! Q M7 X8 z2 m汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
L, L- m5 f3 o9 ]7 j* I2 y字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
: W" t: G+ B5 l; V2 |,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
文件转换为GB码文件,即得到码表文件。
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.
TXT”。
//TURBO C++ 3.0
0 n; \2 a# T7 N#include <Stdio.h>
#include <stdlib.h>
void main(){
1 C7 s# u+ R! @FILE * codefile;
q. @# a0 f2 O% u" i) P7 _int i,j,k;
+ B, ?: A- I. E9 c& j8 l1 u& ~/ V3 zcodefile=fopen("table.txt","w+b");
" B. |- R5 H; J% B# Ufor (i=0xa1;i<=0xfe;I++){
for(j=0x00;j<=0xff;j++){
fwrite(& i,1,1,codefile);
9 n% ]: Q2 D& a; C+ rfwrite(& j,1,1,codefile);}
: p5 V3 n" V( x( [! ?, ]}
fclose(codefile);
return;
5 d( R4 p9 H9 O N- G9 q0 E}
; D/ j3 {& ~, o) m3 u) h- F1 o- G% e运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
即获得码表文件。
第二步 转换
下面的源程序,将BIG5码文件转换为GB码文件。
* X0 ~0 p# I! t//TURBO C++3.0
#include <stdio.h>
( K3 ^' y& J Z. ~9 \( e3 K#include <stdlib.h>
; f) q- \4 D2 C* _( @void main(){
int que, wei;
FILE * sourcefile;
9 C- B2 J* Q: r* I; rFILE * tabfile;
2 R6 M& K# v* Y! c3 ]0 mFILE * destfile;
% t z6 J/ g# U6 A8 W- Ysourcefile = fopen("big.txt', "r+b");
//BIG5 码文件
tabfile = fopen("table.txt", 'r+b");
" E- C& d h! H7 V5 v. A! R//码表文件
destfile = fopen("gb.txt","w+b");
, F2 G7 [1 x# z5 Z( a1 ^/ Y//转换生成的GB码文件
G( T; ^' C3 m( X- ~6 ~' s6 Ywhile (!feof(sourcefile)){
- I z3 p$ f5 M' @# \1 [4 hfread(& que,1,1,sourcefile);
% c& P. i! ^8 M7 b `- A; p6 Kif (feof(sourcefile)){
9 _" }$ M; P. ]% v$ wbreak; }
if (que> =0xa1 && que <=0xfe)
//叛断是否汉字(BIG5编码)
, N. K2 }- U; J. G) p- j5 R{fread(& wei,1,1,sourcefile);
1 f \/ A5 S0 k7 `. D+ O& c1 xif (wei<0xa1) wei = wei - 0x40;
) ~9 u7 `2 e& [! qif (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1;
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
+ wei), SEEK_SET);
fread(& que,1,1,tabfile);
fread(& wei,1,1,tabfile);
fwrite(& que,1,1,destfile);
: z8 T, a1 E F" F# pfwrite(& wei,1,1,destfile);
}
else
fwrite(& que,1,1,destfile); //处理英文
}
fclose(sourcefile);
$ F/ a5 N) }" e8 a8 Xfclose(tabfile);
1 `$ v5 r# m# @6 Tfclose(destfile);
return;
/ q7 V% _7 u- z+ s+ Z( ^5 z}
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
同样的方法,我们也可以将GB码转换为BIG5码。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |