BIG5到GB的转换技术
T. t! o# u" v. H* l1 [) f6 o1 o2 m$ z# z$ N% g8 G
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
{, A/ @1 c! Z' @7 l1 K0 v Y来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就
: Z; [( S! b: L5 X6 }% X- j- ?可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5
码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个
* O- N7 T m, U" K9 n3 n# A9 j, S9 RBIG5编码对应GB编码的码表文件。
5 C- y. x, N0 x& ^2 S第一步 制作码表文件
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
% F" Z$ N2 l2 D% N; t& |9 C' O0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
1 g( x2 D( Q' b+ |& V3 j4 L汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
# ?6 u! } E( i1 g$ S; F字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
' I5 Y9 v5 s9 ~$ t v9 E: r3 A文件转换为GB码文件,即得到码表文件。
* ]9 P% Y9 i( S6 V9 Y4 W9 _下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.
9 V. M( H( x! i1 W+ ~4 E5 ITXT”。
) ^* }+ ]+ N& L$ H//TURBO C++ 3.0
6 Z" @ [3 [# J0 z0 K7 x#include <Stdio.h>
#include <stdlib.h>
' c2 A( w9 N8 |% G/ o/ v+ {void main(){
& E, m- h9 a: o% z- R: KFILE * codefile;
" ]2 A, _, v7 ?5 A* v& Oint i,j,k;
codefile=fopen("table.txt","w+b");
0 p. R; |9 I( X4 N) c* q! ~for (i=0xa1;i<=0xfe;I++){
4 e$ n0 h' }# ^# t" ]6 i" {for(j=0x00;j<=0xff;j++){
fwrite(& i,1,1,codefile);
fwrite(& j,1,1,codefile);}
" |" y3 q0 l. r2 W' R% E) i}
1 R4 J- T$ [" d7 d6 qfclose(codefile);
: R! i) ^8 m vreturn;
}
! Q4 P. K4 `: L/ q2 y9 _2 I! e* m4 p4 Q运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
即获得码表文件。
# w( X; \* v/ C" c; h第二步 转换
, W4 _% B( Q$ _' F8 O6 g5 K7 m下面的源程序,将BIG5码文件转换为GB码文件。
//TURBO C++3.0
2 A6 r: V L* O7 f#include <stdio.h>
4 G4 T/ i1 g1 ~#include <stdlib.h>
void main(){
7 Q! w8 F% A2 H* cint que, wei;
8 M: ~: I: K7 u6 mFILE * sourcefile;
FILE * tabfile;
% y" G) J5 S2 v! h9 L U y* LFILE * destfile;
sourcefile = fopen("big.txt', "r+b");
- p! Z: \' a5 R% _0 |% Q0 t* U! D7 W//BIG5 码文件
tabfile = fopen("table.txt", 'r+b");
//码表文件
destfile = fopen("gb.txt","w+b");
/ {1 g- r% H, H! h) I6 G3 T- L//转换生成的GB码文件
while (!feof(sourcefile)){
' Z% [% D- J5 _& y% xfread(& que,1,1,sourcefile);
if (feof(sourcefile)){
break; }
" { a5 q# ^4 w, C* Q3 I dif (que> =0xa1 && que <=0xfe)
//叛断是否汉字(BIG5编码)
{fread(& wei,1,1,sourcefile);
) S7 r2 @$ d5 i- y* e3 \! }* |: `if (wei<0xa1) wei = wei - 0x40;
- Q2 X( @! v% z/ pif (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1;
* J( \( o; i' ^0 F& P+ ofseek(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);
fwrite(& wei,1,1,destfile);
) m3 C) z/ t+ e9 P) \8 W}
) t) I- p+ k/ @* s! welse
" X% c) S) Q. k0 I' Tfwrite(& que,1,1,destfile); //处理英文
6 L* d$ ?3 g3 A3 Z9 ?}
fclose(sourcefile);
fclose(tabfile);
+ M. F9 Q1 X5 Q6 _- ` Tfclose(destfile);
' Q% X$ B+ e) ^7 m: P7 z& Ureturn;
3 u5 m Y" E+ s}
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
同样的方法,我们也可以将GB码转换为BIG5码。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |