|
BIG5到GB的转换技术
# I' ]# L' O) W: A9 ^ 5 Y2 s. ^0 q+ o0 g6 O+ l) ~
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
8 q$ Y$ D) V2 m% M% k+ d9 N来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
& B3 U. `# {" x7 l. Z8 g% |2 G。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就 9 V e' E5 V$ b2 ?/ D, Q' e" G
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
4 x; U( ?% M- h. G& ?' H汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
. E2 r/ F6 V t' B" F I- v 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5 ( c1 q2 J1 t) i4 c. X s
码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
% D0 H* I& x+ P0 j(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个 " _, e" w# }( k8 u, l
BIG5编码对应GB编码的码表文件。 + h. h! v8 S. M% X0 c+ C3 ^
第一步 制作码表文件
6 w. P9 a# h Z8 _- C8 D( A BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从 7 K" _# X( |6 A, | c; H5 n
0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
& o- D3 s' l2 z# Q) u157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
# B9 N, J# j7 j- g; U$ J- F9 t! v8 g汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
$ S9 `0 x1 u4 y; k% h范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用 ( _3 |' ]4 u& f6 }
字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
2 n: A. C& t( m! _ 制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后 0 s- B# o% C: D/ B1 Z& G B- ]' N" d7 ]7 W
,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
3 T) w& F7 m- |5 z2 |; y文件转换为GB码文件,即得到码表文件。
' o1 ]0 X" T/ C+ c) R 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.
( ?1 z( B# b) ~0 ?; @0 `" i. Q: oTXT”。
& y Z0 ?8 N1 ^8 M+ G& D//TURBO C++ 3.0 ' o5 ~9 @8 G8 Y" y
#include <Stdio.h> 4 u! }' r; j' N7 ?; |0 l$ G3 l
#include <stdlib.h>
6 k2 P% c9 ~5 h& @1 j, y, B5 rvoid main(){
2 G9 H3 V7 K/ x* x' `1 J8 _FILE * codefile; + S6 C- r9 U+ v4 K! ]0 H" A3 Q, P! L
int i,j,k; 6 D* V; y; d2 T6 X+ ^& d
codefile=fopen("table.txt","w+b"); : W; @6 M& O# A* ?% D& \6 q
for (i=0xa1;i<=0xfe;I++){
& N4 S. {5 I* X; A) `/ Efor(j=0x00;j<=0xff;j++){ ; c# f( V& t4 U9 {; ], u
fwrite(& i,1,1,codefile); t0 w% @- h. p$ ~5 ^' Q& z
fwrite(& j,1,1,codefile);}
$ F6 e" A" g4 w} ' I/ M9 _1 [! }
fclose(codefile);
5 R1 ~7 u2 @! Mreturn; ( t* f3 o& P2 R7 H
}
- Q. h! G! @) H7 ?4 d' ^3 v 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码, # o/ N4 {# C6 F# Q
即获得码表文件。
$ }/ a: ]/ K9 G4 D4 e- N第二步 转换 / P0 o2 H# P4 Q
下面的源程序,将BIG5码文件转换为GB码文件。
0 c! }. M" n4 N5 x//TURBO C++3.0
' K' U* L$ A; Q# q/ V#include <stdio.h> 1 H5 l8 D) z$ R: n" M$ V
#include <stdlib.h>
. L$ O/ x, M/ [) H) p: pvoid main(){
! q, q7 M. g) k, wint que, wei;
5 g- m: F( H- k5 ?FILE * sourcefile;
6 g7 x! @3 Q) V& s# L1 {, g0 nFILE * tabfile; V7 B( W! {2 u: X0 F2 M7 D/ \7 i
FILE * destfile; 7 j8 A0 Y% S C
sourcefile = fopen("big.txt', "r+b");
7 n- h, X, a' U6 F! r/ W//BIG5 码文件 7 ?" N6 q& C) a4 D; A
tabfile = fopen("table.txt", 'r+b"); & Y. W& ~7 v4 c8 f( W" p" @' U
//码表文件
4 u, o/ \+ x7 [4 H. D6 A3 Qdestfile = fopen("gb.txt","w+b"); . t7 C* |3 L! f* n/ b
//转换生成的GB码文件
4 M8 h9 _/ |" G9 i$ Cwhile (!feof(sourcefile)){ 0 D: c3 V- v0 Z
fread(& que,1,1,sourcefile); - e/ C+ C7 ?! z( w' t5 ~& |
if (feof(sourcefile)){ 7 T9 u6 ~1 X% `, g
break; } + Z4 k! v# z, Y7 Q* w: n- l; O
if (que> =0xa1 && que <=0xfe)
- x( W6 _2 u) o" X1 M: W/ b//叛断是否汉字(BIG5编码)
! x) n( v% E8 \: t, M# C! w5 y( \{fread(& wei,1,1,sourcefile); 6 O# q/ |, X# {6 l
if (wei<0xa1) wei = wei - 0x40; ; p& ]/ s) H- B% z
if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; * `, e" ]# a; X [0 u& ]
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
% ~% `' G& U0 n# v + wei), SEEK_SET); + b/ b/ y$ d2 W6 w! c# F2 ~
fread(& que,1,1,tabfile); 0 K. j& f8 _ K; d" h5 j2 S; i
fread(& wei,1,1,tabfile); 5 l2 s X# h$ h' E
fwrite(& que,1,1,destfile); 4 X+ w) C5 r. V6 Z* n8 B
fwrite(& wei,1,1,destfile); ! g, A6 Y. r+ |3 J1 I5 d% @8 ^/ W& y
}
2 d7 R/ ]/ @4 r# b- Celse ; N+ f! V% O- A4 w2 ^: }
fwrite(& que,1,1,destfile); //处理英文
' h) p! U' Q' R% @" i} * s7 D6 u% ^9 m) H+ [# U
fclose(sourcefile); + n: }/ d# L* j$ y# e
fclose(tabfile); - r% K0 x5 X$ P" q
fclose(destfile); " V4 S& ]' Z1 ~9 Z% w
return;
* P4 p* T" E+ ]} $ ?. N* C- ~& d9 l3 G
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
% `2 `! ~4 n! B& r/ A( V同样的方法,我们也可以将GB码转换为BIG5码。 |