|
BIG5到GB的转换技术 0 C. f5 |6 a) {( a; O) [) O* X) ^
8 p; \) n0 Q2 \; m$ m中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节 4 v: y( u, ~; ~1 f1 P/ W. U+ \
来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
7 c0 I! k8 Y$ J$ k' p8 |$ @。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就 . ?3 d' J$ [2 S, w
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个
2 y# }, z: y% {0 E6 a6 i/ N1 K汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。 # C$ b4 G7 F& F- @2 R0 m7 D
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5 " Y2 v+ e! T; n/ [9 o
码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码 ) i" R8 s' h- I4 ?7 O% w3 i" J
(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个 $ F, ]; E( D* V2 _# k
BIG5编码对应GB编码的码表文件。
) r* D- D% N4 u3 D" p, f0 d第一步 制作码表文件 ) F( Z( K0 s$ q1 S8 i5 l9 n
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从 % P& K! a+ l$ f/ ^5 v2 p) T) y
0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
) C$ E7 e( M4 Q! s$ @. w/ Y157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
+ b2 X2 c9 l: A. B2 I/ @汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的 2 b! W# }- \5 j
范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
$ ?7 t- F: e& ?& o& @字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
$ r1 \$ T7 @1 N7 g, U 制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后
$ y$ Y( `6 [1 f$ c4 _* T" U: h,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将 9 j4 B, l. Z0 H& d3 l- a6 l6 Y$ j
文件转换为GB码文件,即得到码表文件。 ' Q* t! l9 @) Z( `8 y, y3 K
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table. 5 D' |+ E$ F* o5 D
TXT”。
3 [: H: G3 T# I7 X//TURBO C++ 3.0 + ~; U" E- T. M. o1 R6 a1 L$ C
#include <Stdio.h> ; m$ g4 [3 Z7 h, {; R1 |3 ?; d9 g
#include <stdlib.h>
3 f. D9 J+ e4 Q! _6 ?6 Tvoid main(){ 1 Y& e8 n% A, t# h5 S
FILE * codefile; 9 f2 m. V# P% z& U3 f3 z' S2 v
int i,j,k;
7 U t; b; D" w2 L3 m9 Jcodefile=fopen("table.txt","w+b"); b7 S+ _' H, v5 X
for (i=0xa1;i<=0xfe;I++){
7 I, P3 w, c* P) |for(j=0x00;j<=0xff;j++){
m/ Q( i, |) p' {fwrite(& i,1,1,codefile);
5 w3 L3 O& g0 ^fwrite(& j,1,1,codefile);} 5 P" T* d! j4 m- h
}
: r8 P7 A" Q- }/ Vfclose(codefile); * H' K' |( } l0 O+ ~
return; 9 A: u0 X+ c! W- y8 K! b, _0 e
} ; h2 h# ?7 B4 [- e6 c5 p% y
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
$ Q0 V' \" |5 ^9 U即获得码表文件。
/ P5 H8 U4 k% ~1 Q# g; _' c* H& f( R第二步 转换 0 U. C- k; m. H
下面的源程序,将BIG5码文件转换为GB码文件。
7 _6 A- h$ U% U4 P7 i//TURBO C++3.0
3 M1 g! W; L2 r+ k$ [2 A#include <stdio.h> ( t/ Z" _) I' O+ d
#include <stdlib.h> + g! @$ n& o- n8 c# Q
void main(){
) L X( u5 j, P9 a# rint que, wei; 2 f9 u$ T/ t; \& [/ s( p9 x' G* X7 Z" D
FILE * sourcefile;
~2 n5 j# W- D" w5 cFILE * tabfile;
; P( ~ k& t6 G, M3 I$ H. N2 r& YFILE * destfile;
' X! o t) {. hsourcefile = fopen("big.txt', "r+b"); 4 Q" e c+ T6 Q$ r6 G# m g
//BIG5 码文件 9 S7 @1 [/ L+ B8 s7 u
tabfile = fopen("table.txt", 'r+b");
4 O/ F, z$ }8 [//码表文件 0 U# I3 C: S; |; ?' u& V7 Z% ], d
destfile = fopen("gb.txt","w+b");
. e# c. j; o5 l" T! R//转换生成的GB码文件 % N5 @" Y9 l8 h9 f
while (!feof(sourcefile)){ 2 B q3 L5 j, @+ C1 J4 c% X) S1 q
fread(& que,1,1,sourcefile);
* M6 M/ E* `& h7 |6 ~if (feof(sourcefile)){
- [ g) {2 D7 W! f- Y/ z# S; cbreak; } $ J" i3 u, o8 o/ S
if (que> =0xa1 && que <=0xfe) ; R/ c g; C0 g
//叛断是否汉字(BIG5编码) / ^1 A/ P/ H4 v: j4 m! p
{fread(& wei,1,1,sourcefile);
& e5 N" j, O# P ?6 o* Eif (wei<0xa1) wei = wei - 0x40;
4 N# K: m; @& Z- h$ oif (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; 9 X" a7 B1 m1 L
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )
0 z7 n9 E9 x8 x: q + wei), SEEK_SET); # z' O- U5 {0 s; z
fread(& que,1,1,tabfile); ( ~% a' x# w4 _+ Y* F
fread(& wei,1,1,tabfile);
0 A/ L: j3 K2 H z- s- \8 [fwrite(& que,1,1,destfile); / }7 ?+ x: {) F) e
fwrite(& wei,1,1,destfile); ; g) G! _8 t, u2 C
}
0 @3 m8 I& j3 j; ielse % a4 }& H# P! v, s
fwrite(& que,1,1,destfile); //处理英文 3 }5 p& x. M+ p
}
) x q. N( g; m2 s1 b: ]% _) cfclose(sourcefile); , W8 {. q* t7 `. I
fclose(tabfile); $ b; _8 A ?- Q' n9 `/ u) B
fclose(destfile); ; h* ~* Y( d4 R( F4 H( k3 x
return;
+ R _7 Z. [/ o' K ]}
: m h) e1 f. g1 k7 b4 t% R 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
2 G9 C! `/ g% ~ \同样的方法,我们也可以将GB码转换为BIG5码。 |