|
BIG5到GB的转换技术 6 W2 e: n8 A+ A% G9 {, G, i
7 t! G& h/ b/ u
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
2 b5 s4 L1 [& j, [3 ^: H来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置 , P6 B1 ` x L3 J* x
。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就
- {" x9 Z! w' c( b# i/ L5 g1 F& X可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个 2 O" B! y1 \! K9 a, V) K5 v
汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。 ) S" W. V, ]1 q
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5
6 @$ P9 Y$ [0 J! v5 p0 g2 \码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
% ~1 r# M! M7 @( c& Z(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个 ; r6 g' i' H. W5 i% z& _
BIG5编码对应GB编码的码表文件。
3 |9 _ G2 r0 I3 o f9 _# v第一步 制作码表文件
! k: o4 C6 }. t* l$ w0 S9 g BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从
0 t2 z# C3 X5 `: G1 F7 c3 X$ i0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
6 n: T1 {! ]- q( _0 F' @: E. f157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
, n* e# s. {5 r/ e+ W. e! v汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的
" p, b2 Z& _9 J9 C4 h* d8 v范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
. m; O1 Q) a( G& @0 x z0 g' j, f H字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。 X# d# Q5 W! K, E6 b# i# F
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后 9 G; r; p) ?. Y! k' } B% b. _
,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将
# `* e0 r. L1 t) a- r+ Q+ }4 E8 X g文件转换为GB码文件,即得到码表文件。 - M+ p1 ]4 s# [ K, z5 g+ m0 A @
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table. " S( F( j5 J# W+ G# C! X4 e
TXT”。 " h! I3 a4 y4 ?9 ]3 k# I
//TURBO C++ 3.0
0 {; p; p- I, k+ n; _ }#include <Stdio.h> J+ b! W2 P1 y6 z8 ^: ^# A5 [
#include <stdlib.h>
6 ^: {8 G; |2 |- a; h1 k Gvoid main(){
) D( P0 p- ?3 @FILE * codefile; 6 G% X$ U* [: N" D$ t4 @. u ]
int i,j,k; ; r c: V0 Z/ `5 r$ `8 F
codefile=fopen("table.txt","w+b"); 7 [0 @1 W2 A2 @& k( D9 Q2 g
for (i=0xa1;i<=0xfe;I++){ + d0 l" W& G0 G8 {
for(j=0x00;j<=0xff;j++){
! a* _- B: h* [fwrite(& i,1,1,codefile); ' o1 ^' ]5 h" S4 n) z" G
fwrite(& j,1,1,codefile);}
: W0 |, U8 g# [. ^& G}
* o5 g+ m' S$ E3 I) d; a9 i. Y6 nfclose(codefile); + D. \' o' @+ B- a
return;
3 ]2 q; p! ]. v6 v) X}
" V8 I5 a' s: X' ]7 r 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码, ( }: Q- W4 l' A
即获得码表文件。 3 U/ v3 G( j1 e" l
第二步 转换
& }; }5 Q6 N/ I 下面的源程序,将BIG5码文件转换为GB码文件。
b( w% ^; J3 Y/ k3 W//TURBO C++3.0
! I4 _# e6 d2 \$ U0 k$ _#include <stdio.h> 7 w. G& x1 v( T. q! X2 G* p# l( P) p
#include <stdlib.h> 6 F( U* {1 I4 ~1 I0 x) K) U6 V
void main(){ " Q8 ?2 l2 k, R6 }
int que, wei;
+ U/ E4 j8 ^ Z ?FILE * sourcefile;
6 W1 a3 \" ~5 \4 s/ G# ~FILE * tabfile;
1 O5 K* l! ^+ @FILE * destfile; # B! j9 D$ G# t5 J
sourcefile = fopen("big.txt', "r+b");
+ Y: h. }9 r( u& \$ g' [& u/ d' q//BIG5 码文件
: ], j& s5 e- _# ^& d8 q# a6 jtabfile = fopen("table.txt", 'r+b"); 7 Z3 h$ b* ^4 O
//码表文件
: F% U0 d( O9 G2 e1 K5 ~, Sdestfile = fopen("gb.txt","w+b");
8 Y; K9 o! g2 B7 b4 P) y6 E# F$ K5 [//转换生成的GB码文件 6 G- Q) U \* V( A# W) p7 O6 k
while (!feof(sourcefile)){
. D# a0 j. k1 s$ i' cfread(& que,1,1,sourcefile);
* K8 P% E/ j# R4 [$ F- nif (feof(sourcefile)){ 3 |2 U( b0 W# V3 @
break; }
% e" e. o o7 f3 jif (que> =0xa1 && que <=0xfe)
' x6 I0 H, t( V" `" }$ [7 j1 c//叛断是否汉字(BIG5编码) . G* q9 N0 V! O9 {- R T
{fread(& wei,1,1,sourcefile); 1 J d7 U: Q% d- q/ p
if (wei<0xa1) wei = wei - 0x40;
) _2 ~0 a" F& v8 Q0 K- {if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; + ^& F$ G1 J- Y/ Y5 Y' l" e
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
/ @ D5 a, o2 e& L c7 H + wei), SEEK_SET);
3 p3 [( g+ A1 Cfread(& que,1,1,tabfile); ' ~) i9 C G$ b5 m- ~) r
fread(& wei,1,1,tabfile); 6 k# ~2 G7 `/ }! _
fwrite(& que,1,1,destfile); , j4 {# ]* `* p3 g
fwrite(& wei,1,1,destfile); & X' H' \5 F* K( F( X1 G
} - P9 i2 i& f9 q2 {% j/ ^( H
else : l2 W+ h o. e! K$ `1 G' l4 \! {' ~
fwrite(& que,1,1,destfile); //处理英文
) L% C+ @/ F) c* _3 l}
: n3 f" q' ?5 t& [- zfclose(sourcefile);
" X' U3 Q F7 P0 D' ?+ c, _2 Vfclose(tabfile);
8 l3 w# q! ~6 M B) l& C7 [fclose(destfile);
6 `( q @* i d6 d X9 ? lreturn; 5 R$ W: ]/ }, Q: z; y, G
}
8 Y) w( s. v) G 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用 - [# L7 _1 z+ B; {, G
同样的方法,我们也可以将GB码转换为BIG5码。 |