|
BIG5到GB的转换技术 ' S! O/ E" I$ d# i0 A) {, l0 w
+ x$ D, k+ e$ b, y中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节 . H9 U8 e2 `8 _' G; e# m
来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置 + D" @) ]) } J- a/ G; |1 [
。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就 # ?4 T9 ?- ?0 I* ~+ `+ D; x
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
: K& c$ Y# `( F( m( J. L& ]6 @汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
7 H/ _2 c9 R0 w5 Y 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5
; M0 @! Z: r6 V8 ~码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码 5 i9 V8 d4 f& A Z' A* \
(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个 : d& _9 \& t: H/ @$ {4 Q, C1 f
BIG5编码对应GB编码的码表文件。 4 \6 J4 @3 s# |6 ~, D0 }- W
第一步 制作码表文件 1 m& i# G, D7 a
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
( X; x- _( M" R5 G- S: `3 G1 {6 ]0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
" ?5 N: d! n( h6 z* v( }2 [; y1 m157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
: g6 X& Y4 M }& g. U汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
8 U- }6 v' I, M# }% `0 S& r5 R范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
0 d' ]. \0 V5 C1 L, O5 C+ n1 K% P字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。 6 l% ~' } O$ g. A
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
8 \" }1 I, a& w,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将 1 J. s( p9 G3 F: d, F2 `7 w
文件转换为GB码文件,即得到码表文件。
& c) P% C) T; k9 e5 x6 i: u 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table. - `" d: m+ h! k+ G# h) A! q
TXT”。
9 X. W) b, ^% y+ W3 h! T: z7 H//TURBO C++ 3.0 0 ~& F) ^/ ]+ w! L0 ^" l! B
#include <Stdio.h>
3 L- n2 O. H/ Q( e* l: U#include <stdlib.h> 4 I( ]& Z% r$ J3 M- C7 V
void main(){ 8 N ^& t' M0 X* t- W1 j
FILE * codefile; 6 ^2 ~: A0 d$ \0 }5 d; @4 F7 n
int i,j,k;
8 G* C: x9 K6 g) |+ Mcodefile=fopen("table.txt","w+b");
' ?+ K: U0 _% R, V# efor (i=0xa1;i<=0xfe;I++){
4 B% _4 V: U% [for(j=0x00;j<=0xff;j++){ . C/ m# @ u$ T7 @5 r) j3 s
fwrite(& i,1,1,codefile);
& u, p& k& Y6 W0 { W7 vfwrite(& j,1,1,codefile);} $ v- R- a2 b2 W9 `, C% s3 d
}
+ U4 K% q/ r+ A8 z C+ ufclose(codefile);
! @. E5 D: r- Z: q# }, j0 Treturn;
2 o7 N; o- c* L/ c6 l2 Q} 5 C4 ]( w/ D' \
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
- s' z0 S; U6 T( j% m& u8 c2 \即获得码表文件。 / @# U. {' i+ `2 x& O. D
第二步 转换 ( C1 M" F7 l3 s$ C/ l0 B- R
下面的源程序,将BIG5码文件转换为GB码文件。 9 ~4 Y2 W/ g5 }2 [3 L, Z6 A! t
//TURBO C++3.0
Q8 y4 T2 `6 [8 W) ~( }#include <stdio.h> - W* j1 D5 y+ {: u& D1 J3 }
#include <stdlib.h>
9 o2 e) j; U/ Y& s9 d# a# Yvoid main(){ 0 k5 t6 K. _! d: P
int que, wei;
! M/ K/ [, d2 Z/ N) m: W, E: [FILE * sourcefile;
% Q+ l0 n f2 e4 }6 f6 CFILE * tabfile;
+ X9 {1 F' j0 y: w( G- WFILE * destfile;
( B$ n$ m. z6 Z# bsourcefile = fopen("big.txt', "r+b"); 0 z) h* ^9 z7 R
//BIG5 码文件
0 t3 K( k1 h5 C) Ntabfile = fopen("table.txt", 'r+b"); 0 z1 i) ] g: h
//码表文件
! v R( G6 i! P! G+ u, Udestfile = fopen("gb.txt","w+b"); ' @- x8 ?2 X& B c$ i+ _7 x
//转换生成的GB码文件
8 i& o- ~: D$ ]5 Z' c+ Awhile (!feof(sourcefile)){ # }' A! q: p9 O9 N J/ l; u m$ p
fread(& que,1,1,sourcefile);
, ^" f4 |. Q2 r6 k1 {if (feof(sourcefile)){
2 O, c4 s' u7 I1 ]break; } # V d; e7 { o5 ^* l3 v; _- @9 w
if (que> =0xa1 && que <=0xfe)
8 N P9 D$ f9 V$ [# S5 f( _3 M//叛断是否汉字(BIG5编码) ( I4 o! B7 y$ o( Y
{fread(& wei,1,1,sourcefile);
' p- q' Z3 ^! @9 G( mif (wei<0xa1) wei = wei - 0x40; . G; @3 ^( {) i; H
if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; , F( c6 U: _6 } n* f& z
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 ) / z. s- f3 D5 i" F, `; J! A5 h" w
+ wei), SEEK_SET); y4 i; F9 q: T- @; e1 I
fread(& que,1,1,tabfile);
: g% \) f/ M2 i8 {# D) f- Vfread(& wei,1,1,tabfile); / x& \2 L" y1 A5 F' V* {" x' ~' x0 p
fwrite(& que,1,1,destfile); ) f$ s2 B* j% R7 {1 v
fwrite(& wei,1,1,destfile);
8 v' G1 g& l3 ^+ A} : _5 x$ y( j4 G
else
+ V) @' a% g8 X( j( j* Q( ?3 Qfwrite(& que,1,1,destfile); //处理英文 R, D' F6 f) l# j
}
& Q. f6 E" v" I, W! W' g$ ]1 |& w; Rfclose(sourcefile); & V( s$ r/ p$ F7 Q1 N5 r+ o
fclose(tabfile);
; l- P* D2 S+ O$ pfclose(destfile);
+ o5 o, @8 S, [6 u% E" I& _return; + T: u8 x, C) l
} ! x3 p" |3 W! n0 D
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
- e% M9 W- I# {5 v同样的方法,我们也可以将GB码转换为BIG5码。 |