|
BIG5到GB的转换技术 ) _8 M, I+ h7 L, S% l" t
/ P w$ X% X7 ]) t9 s. p% J中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节 ! y5 Y7 B+ j! o
来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
, B% }+ J9 Q+ O7 k8 r+ C。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就 $ f/ D/ ?+ p# C1 ~: z, a
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
9 n: Z0 M) E- ]2 U5 ^+ n9 W l0 D汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
4 V% T$ Q3 z4 d& b, V5 W4 ^% O 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5 1 [( J6 a; V1 u/ A
码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码 6 H6 [6 V" \' a, M0 o! k( ~1 k
(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个
; ^8 Y( \. b# L0 Q7 V/ |% wBIG5编码对应GB编码的码表文件。 $ x. w, P4 ?, D9 Z. }' m* c
第一步 制作码表文件
% d, U# L! `' x# H7 Q BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
' ]5 M* ?4 t+ G3 F( y9 N0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共 : r# V; f: o+ ^; s( m* ^4 n
157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些 1 Q0 i& c9 S/ o( q# e" S% v
汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的 ) B+ Z4 L" e( K
范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
2 c. G: [4 I. ]6 y; t+ V: d4 i' Y字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
) d% Z/ g5 i1 u; A3 b! {" l. d7 R8 T 制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
% j* ]' B/ E. i/ r1 n7 m: t& T,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
9 m! N1 J' ?# q1 S, v" i文件转换为GB码文件,即得到码表文件。
/ R* n! m3 ]6 Z' P1 d- x. J. a d 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table. + H5 o9 [- F( r' m; |
TXT”。 % { L3 x: x% }* a; N& y
//TURBO C++ 3.0 5 V. s, W/ S, _& g/ {
#include <Stdio.h>
* K3 b) `& E) H3 r#include <stdlib.h>
8 h4 [3 P8 T1 S9 n1 _0 f, zvoid main(){
) M; p; Y. G' Y' u/ yFILE * codefile;
, p& M* v- ]# q3 L% zint i,j,k;
1 P. N# w) i7 M! c& ~$ k% d3 i4 l* Vcodefile=fopen("table.txt","w+b"); 7 A/ l" q8 `6 L# Z! D8 i
for (i=0xa1;i<=0xfe;I++){ ' `0 M$ c7 a# Q1 C) ~: c+ W
for(j=0x00;j<=0xff;j++){
$ B% o! o8 ]4 M3 Pfwrite(& i,1,1,codefile);
+ x/ q" M) }( b' J c9 a$ W! }" Ifwrite(& j,1,1,codefile);}
2 K5 K9 S0 b$ g- n: W" `9 x1 F} 7 D5 D' y3 v0 K- i3 g$ ^
fclose(codefile); : q* J, v! H: \+ k$ h P1 X
return;
3 E/ _, T. e- t}
$ B- `5 ?+ d) W4 {# T: {# R$ M" o 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
$ V1 w& w& N- ~! D4 z7 F$ [即获得码表文件。 5 z, a2 T' y! T$ }) V, A9 c
第二步 转换 7 ^9 a8 C9 j; K) l" N8 m+ A
下面的源程序,将BIG5码文件转换为GB码文件。 / g4 `- W# g) M0 K- `
//TURBO C++3.0
4 F) f. F( p' M#include <stdio.h> ! A- X, l+ B' Q6 |- X2 @
#include <stdlib.h> % ~* k. C, a8 R
void main(){
, U/ A3 s6 X8 ] Cint que, wei; ' x# e* Q8 z2 c9 ^6 r% n8 o
FILE * sourcefile; " U* Y8 u0 i) S8 R
FILE * tabfile;
) V: @' \% W0 `1 HFILE * destfile; + K. \2 `- u% N4 F4 o
sourcefile = fopen("big.txt', "r+b"); ) k& Z0 B' r) d' i
//BIG5 码文件 & t$ s2 B; L. a7 R5 k6 r9 I
tabfile = fopen("table.txt", 'r+b"); , d% A( R; c D2 ?
//码表文件
8 b! O& S$ |+ L- s1 S$ ]destfile = fopen("gb.txt","w+b"); 8 e7 g& ]! r, ^* l9 H/ H6 W3 D
//转换生成的GB码文件
) ~! l9 h0 _& cwhile (!feof(sourcefile)){
( S! B1 b% W- L: S, {) T' `3 ]3 Afread(& que,1,1,sourcefile);
8 L3 ?9 g6 W8 `* `9 F: lif (feof(sourcefile)){ ) B6 H8 a3 M' l
break; }
/ C1 ]; ^6 L3 r$ D% [if (que> =0xa1 && que <=0xfe) ' { ~4 J" E: ~- b" ~" n/ N
//叛断是否汉字(BIG5编码)
3 A. t4 S3 w$ H% C4 V{fread(& wei,1,1,sourcefile);
9 C+ N# ~1 q& X% _/ v4 @7 [8 Xif (wei<0xa1) wei = wei - 0x40;
, Z1 U( H, a2 H3 eif (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; ' J7 ?6 a- t1 F, ]
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
# g* `! V: Y# t: s) L' W + wei), SEEK_SET);
' h% K! z! L) Pfread(& que,1,1,tabfile); $ {* A2 g, G$ m( J1 z" m# K6 m
fread(& wei,1,1,tabfile); $ N; ]* c, z l: u2 z
fwrite(& que,1,1,destfile);
; e1 t; y+ z+ Hfwrite(& wei,1,1,destfile); 3 e9 `( V- H: T; K, q
} . M8 z$ b) w) J9 j' @
else 2 X4 j+ k" Z3 @+ o) ?! N
fwrite(& que,1,1,destfile); //处理英文 ' C9 ]7 ?$ N2 B3 _4 }* \5 F7 k
} + ~: j+ n# i- u# s) t& n8 a
fclose(sourcefile); + F9 f. `5 w6 J- D
fclose(tabfile);
( n7 u# a. e# i- [8 t6 R3 gfclose(destfile); 2 Y$ I8 R4 q. m& {
return;
p+ l9 y% u, }" j* r- V! [} 7 l% h: F5 q: F1 K) V7 i
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用 / E i7 d' H1 j6 G
同样的方法,我们也可以将GB码转换为BIG5码。 |