数学建模社区-数学中国

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

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

BIG5到GB的转换技术

1 e! d0 p, l' ]! q

5 C. @$ x4 i) M3 l

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

4 x) n, c4 b) x6 p* F+ @( d

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

5 l! |4 C$ ?7 f

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

: D0 I: d1 |9 G8 q3 y* e9 ]

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

" j: t3 {; N# M1 @+ v- A' ?

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

/ P/ w# N: K8 N# K; A

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

$ }) k v5 g8 P) Q) O7 ^; E

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

c- [- M' c! L3 i0 ]

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

) v4 v" ~' W1 k: m1 _4 ?

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

2 _7 Z% Q, S8 ]- C- o/ E

第一步 制作码表文件

" I( L/ d" }: W! _, \5 y5 w% }

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

4 c: C5 S# t* ]% ?0 y8 A$ X1 d3 |6 Z; C

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

+ @- S! D- O3 m; i! ~

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

u: x. W# {: `4 f

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

( Y' {) ^% O2 q% H

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

1 _5 e1 k/ o8 k7 ]5 U

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

& n* H# F' V Y6 [* p

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

) d1 R9 }4 r6 |& F8 h5 j5 n

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

: D6 Y' ~% f: o1 o

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

8 z9 W4 `0 b( D$ v( N w' P( j4 R

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

/ v! ~4 }( t; O" S$ B) S

TXT”。

1 n9 O' H! i. r# ? L

//TURBO C++ 3.0

: d9 g& T0 j6 I

#include <Stdio.h>

9 W3 @7 n9 Y, a$ {+ ?$ ~* P. A0 Z

#include <stdlib.h>

6 v# d' Z1 j4 W L1 Z

void main(){

4 ?$ A4 q5 O0 E# V: D5 T

FILE * codefile;

2 R* e( e# u6 Y% Y4 b' D# Q

int i,j,k;

" ^. K) a+ [9 i- k( P

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

% v4 t+ X+ W) V0 }1 [. X! E

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

0 A9 f; Y, R8 `, n

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

2 R; y9 I: W0 M' E( x

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

' p& k5 S6 u7 _

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

1 G7 q# B& K& ?% X' [' R

}

7 L1 ]1 t8 h U1 u7 @+ A9 K

fclose(codefile);

/ \/ q, K) n* K0 {* P% T' {9 K* F

return;

3 }, A/ o" M, F2 c# t& L0 {

}

3 ~3 Z6 J* Q7 s) ?7 r; x

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

! @7 ^: }% D* J" L F n& M1 s. `

即获得码表文件。

4 l ]. F8 r( `* g/ S

第二步 转换

+ s7 {; D6 A! \

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

( w4 C3 A0 H& ^5 g0 j1 }$ y" t

//TURBO C++3.0

, |( l" u7 ~$ E) H. A+ f9 I2 H

#include <stdio.h>

, k L" Q2 X# r0 C! t- K. n; K' \" s

#include <stdlib.h>

U. {/ Q' z8 y; l

void main(){

0 T x6 D5 N& ~6 b9 n

int que, wei;

6 A2 W2 C7 N1 c- K

FILE * sourcefile;

. E3 U# |: E* N3 n. l

FILE * tabfile;

3 _9 C2 g$ g" Z! z: h3 b5 ~* c

FILE * destfile;

1 u- z% G8 {( q5 x, Y- b& t( a8 @

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

. K+ L. d& E% z* L

//BIG5 码文件

% Z+ X' ^/ X+ o# v# |9 S& a j1 y

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

) C' K8 C( G9 T% P* W4 f( w b5 X

//码表文件

6 i% \" H. z$ J% x9 L5 j0 X

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

/ {0 [' i* b) l6 j! R# M2 ?

//转换生成的GB码文件

" p; Q6 J6 A" W; c

while (!feof(sourcefile)){

4 {8 E* ], ~6 |# @* D% T

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

, ?; n+ T4 i3 o+ i

if (feof(sourcefile)){

. b- e- G9 ^$ M5 {6 L0 i! }& {! s6 \

break; }

, C4 E7 ~' h4 { @5 c

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

! e/ D B D( ~

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

$ z6 g; F. \ n/ E

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

* X C4 J8 u% f$ v8 Y3 ?) x

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

' R) {" C' b& X3 Z, `+ Y& F, C+ a' j

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

) c. Z" }2 o5 ]" `7 t' S

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

/ y3 P1 L q& }0 C( N* }

+ wei), SEEK_SET);

; n5 H% A) A! ^4 K5 o6 [5 F

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

0 x x# F/ B; v7 x. J" w; O0 _2 k

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

; G4 M6 Z- E: H' `0 X% x+ l" t

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

$ }' K8 r6 K3 j1 j3 T, z

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

5 A6 P2 s. b$ J X

}

8 E( U' t" Y& t3 w+ \

else

- H& g6 l+ a) S0 @4 s

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

; ^2 K1 T3 G; y( p

}

/ X; [% `; d4 z7 K% E2 o

fclose(sourcefile);

$ k% @0 }; I" v3 _3 i" W

fclose(tabfile);

# k) m7 J. \2 ^" [; W. i

fclose(destfile);

9 j5 h! \: H: e0 j' b* Y

return;

; Z' J( f4 C/ V- m+ _, g! W2 M: ^

}

3 X. j2 G6 l- y+ X4 ]8 [" z. F

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

+ \2 [9 e3 G: K2 M

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






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