数学建模社区-数学中国

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

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

BIG5到GB的转换技术

: H0 r0 @ [. D; ^' ^4 P$ x

s( O! t2 m Q! b: p

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

1 c% |0 O5 x# d2 k) z

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

. _' ~; X, I, W1 B& k; J

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

$ ^0 l6 k i8 F+ m H

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

. M* e2 f! m' j9 B; b, i* j

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

0 Y# }" d& [+ k! G7 u- M% H

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

* b5 Z2 F8 c+ k7 c9 H& ?- {* ]& }

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

# G2 Q, t) U* ~1 `) q% j

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

4 B! w; l4 h* V7 r7 U

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

) ?& @* c) @5 ^' _$ X8 {* ~; J! X

第一步 制作码表文件

1 z$ ?/ y5 k+ a+ K3 B

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

. @; _9 t5 B" G( J# j, ?; T( W

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

; \ S) w9 y# a: c

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

C6 s/ I6 T, b+ V% ~) @0 d

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

8 c* z y9 M; t- z

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

& P* s. _+ y. |8 W* C! y7 s

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

8 g8 a/ }0 L3 ^

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

1 I* P( @- C0 ~5 P0 t$ m- s/ ^

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

2 g: [( ~8 h- m" T6 Q8 {; N

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

v2 |. a" c7 K" O" a

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

! b, K6 x1 Q. m. r

TXT”。

: E8 n3 n* E# R' {

//TURBO C++ 3.0

+ N Q- T% R) `* S* |' u( }

#include <Stdio.h>

3 y) N" O1 L6 l. `8 a

#include <stdlib.h>

$ O) ^6 V: O0 n

void main(){

+ R/ I) `0 ], x& P

FILE * codefile;

: B9 ^3 X# h+ i% q" [7 a) J

int i,j,k;

9 [8 \4 l5 G1 t

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

' N* N2 K8 w( N8 D2 ^; _- A- `

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

! |8 c7 ^2 Y E) b

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

+ h, ]; D Q0 X, j( K. g& i

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

0 E+ p# L3 L" @. v# V' {6 p

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

* B" P" \0 |" ^- `+ V. n

}

4 }" c9 _ G6 B! q/ ^$ ~# N/ ]

fclose(codefile);

8 K, i8 ~) i( F7 J1 Y

return;

/ l! z: Z7 k' u- r: Y7 v- Y

}

" a. F+ U- A; Y' J9 R2 F

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

. l( l9 _% m6 v z9 f* `

即获得码表文件。

% M* u: C0 G# g) l

第二步 转换

1 l, q' h2 b( N2 h

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

. t* R/ d4 W4 l3 M% q9 p) n- \

//TURBO C++3.0

8 x) w' W( V( W' g. J

#include <stdio.h>

* p$ g6 d7 u2 N: ]

#include <stdlib.h>

$ L! S( n0 B$ k- S

void main(){

% e m: J- h V9 }5 ?; I

int que, wei;

! ]+ z6 m! p0 A- }1 F" q1 F; H8 w6 v, J

FILE * sourcefile;

/ N. S, ?. P/ J& N

FILE * tabfile;

1 l- D" a" p0 o

FILE * destfile;

8 \7 {. S' c6 ~# @6 y" u

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

/ }7 s4 n$ x7 B1 T

//BIG5 码文件

7 `, ]6 ?; R# U) w! i, [$ D

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

6 |9 ^. b& m ?1 F9 K5 i- Q

//码表文件

7 B( j8 [: K/ E! p

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

6 t6 k. h; l* }+ n

//转换生成的GB码文件

7 X6 B7 u7 x3 e0 g0 L( q+ v9 J

while (!feof(sourcefile)){

: c4 |0 a. n/ ?) |) s" S$ D

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

' [& Z! C7 t6 @5 Y: L2 `: m

if (feof(sourcefile)){

/ R9 o! Q$ m( [5 f8 {- f/ C

break; }

! L/ @1 ~2 v! p7 s$ o* [9 ^

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

! L8 Q+ l/ w3 Y' ?: u

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

8 w0 e4 C+ x7 j5 I% p/ H6 ^7 `

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

1 g4 W9 k* O( B6 T$ |4 {

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

# k1 E& U9 ]* M: ]

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

9 A9 z% t( m2 A6 ~

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

% P: s! y& k4 V0 H- X* }' B

+ wei), SEEK_SET);

( h: R# e3 n- y

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

4 s/ v/ Z6 X0 Z) B' G

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

4 ~4 C' W! Z- b3 J( w: ^

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

. K Z: b; }) ]( |( p

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

% e2 f4 z- d' H7 `6 @* D& C

}

! N4 t! c- f* z

else

5 |! A! _( M5 h7 _8 e

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

: i5 D8 {* o `+ `

}

4 j- t9 R# B) b5 j( \

fclose(sourcefile);

' I6 e2 O; w& T) ~

fclose(tabfile);

K$ r( r* N( `$ E

fclose(destfile);

. m! M2 s$ {4 x

return;

3 ~- g( \! E! l

}

8 H# _$ {6 i7 D1 j* }

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

; ~* l$ ~" j$ d) k7 G6 w

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






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