数学建模社区-数学中国

标题: BIG5到GB的转换技术 [打印本页]

作者: 韩冰    时间: 2005-1-26 19:31
标题: BIG5到GB的转换技术

BIG5到GB的转换技术

% c4 a9 l$ U3 g

& p& f x3 Y, n

中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节

* O8 n5 ?! H* x6 t9 x6 Y0 y

来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置

8 C- \+ \; Y( D7 N* x7 q

。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就

) a1 E& C0 r% v- _9 b, \

可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个

8 A# W& e2 m; w( v8 ^* g

汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。

5 v6 n+ Q& H t9 a- B, N$ y2 T

汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5

4 R! F5 Q9 ?6 l8 J: l! r) r

码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码

: k- ^; ?* Q# G _7 c8 }" M

(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个

6 `) G& N& q1 C3 U+ d& X

BIG5编码对应GB编码的码表文件。

7 T) p5 `7 x; L/ I0 K

第一步 制作码表文件

0 _ W ]2 h2 j" s2 y. d* E/ ^

BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从

4 s/ L+ _! Y, S* D

0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共

) \' ?+ T) q) e" v0 l3 Z; U/ f/ C! k

157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些

3 ]" M" K7 x! Q M7 X8 z2 m

汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的

( q% S# a( i; U l

范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用

L, L- m5 f3 o9 ]7 j* I2 y

字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。

/ L! ?9 K% L; x4 u, m% @% E- [) x

制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后

: W" t: G+ B5 l; V2 |

,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将

, G' D5 X" }9 i4 {; D3 e

文件转换为GB码文件,即得到码表文件。

( P8 `. E' L& E! B

下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.

( Y5 s& u4 ?8 ~9 J1 b! [2 {

TXT”。

6 h' C9 ?) {% J, E

//TURBO C++ 3.0

0 n; \2 a# T7 N

#include <Stdio.h>

- {# B; ^9 Z1 F3 G! I

#include <stdlib.h>

+ t/ x* ]( f" b# l3 @

void main(){

1 C7 s# u+ R! @

FILE * codefile;

q. @# a0 f2 O% u" i) P7 _

int i,j,k;

+ B, ?: A- I. E9 c& j8 l1 u& ~/ V3 z

codefile=fopen("table.txt","w+b");

" B. |- R5 H; J% B# U

for (i=0xa1;i<=0xfe;I++){

6 F1 Y9 v7 l. o; R _2 C

for(j=0x00;j<=0xff;j++){

$ n+ n+ S) H& D0 h5 g

fwrite(& i,1,1,codefile);

9 n% ]: Q2 D& a; C+ r

fwrite(& j,1,1,codefile);}

: p5 V3 n" V( x( [! ?, ]

}

; k, G! v/ g- G

fclose(codefile);

- |) u7 @, r& q

return;

5 d( R4 p9 H9 O N- G9 q0 E

}

; D/ j3 {& ~, o) m3 u) h- F1 o- G% e

运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,

+ a1 O+ \) x9 G. T j- G1 T& ]

即获得码表文件。

- R4 d6 n$ G+ Q5 U: T

第二步 转换

! _5 H$ p& T V# u; W

下面的源程序,将BIG5码文件转换为GB码文件。

* X0 ~0 p# I! t

//TURBO C++3.0

9 {$ k- t' H) `5 N U" C5 l. m

#include <stdio.h>

( K3 ^' y& J Z. ~9 \( e3 K

#include <stdlib.h>

; f) q- \4 D2 C* _( @

void main(){

1 Z7 M" a/ i. h& j$ y- V6 W

int que, wei;

4 w* t+ M* [+ l& ?; V3 A

FILE * sourcefile;

9 C- B2 J* Q: r* I; r

FILE * tabfile;

2 R6 M& K# v* Y! c3 ]0 m

FILE * destfile;

% t z6 J/ g# U6 A8 W- Y

sourcefile = fopen("big.txt', "r+b");

, M4 q' `. F7 U% E4 ?% j& L

//BIG5 码文件

P8 Y9 J- _& r- m* K( X7 p2 v

tabfile = fopen("table.txt", 'r+b");

" E- C& d h! H7 V5 v. A! R

//码表文件

' v5 B; B& ]- d: ^

destfile = fopen("gb.txt","w+b");

, F2 G7 [1 x# z5 Z( a1 ^/ Y

//转换生成的GB码文件

G( T; ^' C3 m( X- ~6 ~' s6 Y

while (!feof(sourcefile)){

- I z3 p$ f5 M' @# \1 [4 h

fread(& que,1,1,sourcefile);

% c& P. i! ^8 M7 b `- A; p6 K

if (feof(sourcefile)){

9 _" }$ M; P. ]% v$ w

break; }

0 X# h9 I7 E; j9 R0 X5 _

if (que> =0xa1 && que <=0xfe)

. [3 P) g4 ?5 P# S+ n5 v/ [$ m/ H

//叛断是否汉字(BIG5编码)

, N. K2 }- U; J. G) p- j5 R

{fread(& wei,1,1,sourcefile);

1 f \/ A5 S0 k7 `. D+ O& c1 x

if (wei<0xa1) wei = wei - 0x40;

) ~9 u7 `2 e& [! q

if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1;

3 @* l6 {, J! [' h! w! B0 d

fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 )

. D5 R" J Y8 O3 @: L6 Y8 M1 G! y

+ wei), SEEK_SET);

( N$ L5 E P- w! c

fread(& que,1,1,tabfile);

& c. ]& u6 `- t# [- I" c( M

fread(& wei,1,1,tabfile);

- ^1 o# c( O) D2 c+ y. j

fwrite(& que,1,1,destfile);

: z8 T, a1 E F" F# p

fwrite(& wei,1,1,destfile);

% l4 c9 f' e+ q3 Q: ] J

}

) e. `& H( T- t& p

else

" |* p/ N# }& u

fwrite(& que,1,1,destfile); //处理英文

4 }6 w B% v; n" p0 w& o, H% e( A

}

* j5 k+ A- F; m% t2 I

fclose(sourcefile);

$ F/ a5 N) }" e8 a8 X

fclose(tabfile);

1 `$ v5 r# m# @6 T

fclose(destfile);

: \ V, }1 B* H3 |' C

return;

/ q7 V% _7 u- z+ s+ Z( ^5 z

}

$ ?/ n* q* h" b) M: L% T

以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于VC或VB程序中。用

, \9 q+ \; o: M1 ^: D: h0 ?+ W; p

同样的方法,我们也可以将GB码转换为BIG5码。






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5