|
BIG5到GB的转换技术 5 k% O* v' E1 R8 b- T: \
; a/ Q! n: r3 D+ R! L# M中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节
0 y/ Q3 C( P, x, z6 @% S7 @来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置
# H: Q: ~& w/ P( M- x, X。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就 5 H! h0 M) ?; x2 z
可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个 & K% W; D7 r" u" G8 [4 P% S. @
汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
) c0 |& I/ U2 a6 u, d+ w# C 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5 ) @: \4 z) W6 q) p) p2 a2 d# D: a
码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码
* ?7 C0 g; w d(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个 ) U7 o2 P8 n4 K3 }
BIG5编码对应GB编码的码表文件。
& u7 e3 ~, P5 d7 n3 c; I第一步 制作码表文件
8 t2 p* e, J1 `9 i BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从 ( D, n8 k& b# Y1 J5 p7 |
0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共
6 q5 [1 |: A- y7 `157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些
. o: m& t# j* k6 j8 l汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的 % Z) B: e2 \. |+ e9 g1 i7 t
范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用
6 q* V" B# r/ B9 s( A字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
& ^8 s; e1 [& Y; _ 制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后 $ @& Q& z$ q6 c6 x. S- F
,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将 4 M- g) P& p5 R% d; \: A8 E
文件转换为GB码文件,即得到码表文件。 " L7 n6 S4 m8 z! n
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.
+ c q# H% _, qTXT”。 1 h1 e8 {, X. V* q
//TURBO C++ 3.0 : L7 G ~# V z9 J
#include <Stdio.h>
2 ?; R' Q! |& P: _! T6 J#include <stdlib.h> 9 Z. k* Y" u* w5 ]0 u
void main(){
1 T* j) v2 g6 [FILE * codefile; 1 m0 U0 N. Z7 w' _" N' R/ T
int i,j,k; , T; v1 A/ X0 i7 s) i/ B+ v
codefile=fopen("table.txt","w+b");
) T% c& o( e9 c/ V# X/ Hfor (i=0xa1;i<=0xfe;I++){ , ^( ~. ~4 u( @* d. ^. m* _4 G( W
for(j=0x00;j<=0xff;j++){
7 b% b4 z4 K9 Lfwrite(& i,1,1,codefile); 5 G$ n, ^# ~; o w& P% `. a* P
fwrite(& j,1,1,codefile);}
! w# }7 m8 `8 ^6 i} ) [$ H; g7 @7 ~6 h
fclose(codefile);
4 T N5 ?# e; ]& Q4 Y+ q3 |. z" c2 a- greturn; & o* F# v8 F" u2 o8 j O7 R: ~
} , d2 w1 s+ _; j' z" h- }1 Y. a
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,
6 D( V" X) z2 a; V% S6 a即获得码表文件。 - }5 ~, \$ V7 l5 \4 e# Z
第二步 转换 ' ?/ m1 s$ w% d) K/ w5 H
下面的源程序,将BIG5码文件转换为GB码文件。 0 C. d% u& @2 h1 k% B9 f
//TURBO C++3.0
9 v! k9 Z5 |' q' ~! L#include <stdio.h>
* w: f2 {8 x+ R5 L1 W" U#include <stdlib.h>
' I4 U8 d& [5 |; A9 Zvoid main(){ 7 v) [ h- S# @- y7 b2 s+ E
int que, wei;
2 g; X" v1 Q! zFILE * sourcefile; M9 T1 v' A# f0 T/ {/ O6 N% |
FILE * tabfile;
- S" M& @: @ n2 C6 q. lFILE * destfile;
. r' d/ }. T/ l7 ?; P0 W; k9 \sourcefile = fopen("big.txt', "r+b"); * J5 o2 d- @* _# A' ]) v
//BIG5 码文件
% f! K$ l. K* {* @5 M- I* [tabfile = fopen("table.txt", 'r+b"); 8 R+ l+ M* J6 |' |, Z D$ i8 R
//码表文件
& Y9 g+ t$ d. j/ F$ t& Sdestfile = fopen("gb.txt","w+b");
; j5 y, j! X$ i/ N" n* T V0 X//转换生成的GB码文件 " w2 V& Q( x* [" O1 ?# N
while (!feof(sourcefile)){ * B2 p; V4 [+ w, P& ]7 J. S
fread(& que,1,1,sourcefile); 9 l1 `* x8 m7 [% {. W
if (feof(sourcefile)){ 9 v. x( s& i0 P9 z, t
break; }
" ^* n; U8 t2 fif (que> =0xa1 && que <=0xfe)
% d+ `; S: Q1 b//叛断是否汉字(BIG5编码) 2 w% _9 m- Z' e! M
{fread(& wei,1,1,sourcefile);
( k; @' A6 J0 ]! {3 Gif (wei<0xa1) wei = wei - 0x40; " }2 p. y [( B7 l/ i
if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1; 3 ]1 w0 n" j) q2 \+ |( F0 j3 ?0 X1 d
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 ) 6 x2 `) l7 B4 j& E5 x
+ wei), SEEK_SET); 7 ~$ X* e, Z) j8 B9 ]
fread(& que,1,1,tabfile);
z5 g, E) B5 sfread(& wei,1,1,tabfile); + B" S1 {7 d& x% |, {9 k. Y8 ?( c
fwrite(& que,1,1,destfile); 1 r- G+ V* Z/ f0 H d/ A8 _& _5 p
fwrite(& wei,1,1,destfile);
1 Y+ W! J9 ]+ z1 u$ g5 B}
D! b) u+ ?, x! F( W! X5 Nelse % W0 s$ z/ l5 m7 L1 K2 l
fwrite(& que,1,1,destfile); //处理英文
. O# o5 h. W% Q" G, b L# U1 A, [} 0 @$ D [/ w, J( Q
fclose(sourcefile);
0 k+ A* r+ U# _6 Zfclose(tabfile);
, _2 c/ g* c, |' B# Mfclose(destfile);
8 I8 j f4 O: Xreturn; * {1 x, {, K/ H4 H @5 @
} : b" T4 `6 l9 f! i" l, H8 |
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用
8 o8 h& S: K m* ~: _ `2 ]" @3 F, \同样的方法,我们也可以将GB码转换为BIG5码。 |