数学建模社区-数学中国

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

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

BIG5到GB的转换技术

T. t! o# u" v. H* l

1 [) f6 o1 o2 m$ z# z$ N% g8 G

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

{, A/ @1 c! Z' @7 l1 K0 v Y

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

6 T* M1 O3 G# l3 {

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

: Z; [( S! b: L5 X6 }% X- j- ?

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

( ~- _" X$ g6 p {; V; T4 g

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

# \3 B: ~* {4 a0 V9 M

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

$ o! ]- w0 O( H2 d- L

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

# r% [; a3 K& t/ E7 j( l' n

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

* O- N7 T m, U" K9 n3 n# A9 j, S9 R

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

5 C- y. x, N0 x& ^2 S

第一步 制作码表文件

$ \+ l& W# R/ {: y4 ~9 v! G

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

% F" Z$ N2 l2 D% N; t& |9 C' O

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

. n* b3 F. M5 r4 E: k' q" Z4 W4 R2 A

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

1 g( x2 D( Q' b+ |& V3 j4 L

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

: a6 i# K0 k2 Y

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

# ?6 u! } E( i1 g$ S; F

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

2 o2 b( s7 Q; G( n' k

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

. |& o$ P3 q7 C1 l9 @% ~

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

' I5 Y9 v5 s9 ~$ t v9 E: r3 A

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

* ]9 P% Y9 i( S6 V9 Y4 W9 _

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

9 V. M( H( x! i1 W+ ~4 E5 I

TXT”。

) ^* }+ ]+ N& L$ H

//TURBO C++ 3.0

6 Z" @ [3 [# J0 z0 K7 x

#include <Stdio.h>

7 g# R2 s1 S1 z; B- D

#include <stdlib.h>

' c2 A( w9 N8 |% G/ o/ v+ {

void main(){

& E, m- h9 a: o% z- R: K

FILE * codefile;

" ]2 A, _, v7 ?5 A* v& O

int i,j,k;

: t" n9 B4 y- C H! D/ B1 _0 `& w

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

0 p. R; |9 I( X4 N) c* q! ~

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

4 e$ n0 h' }# ^# t" ]6 i" {

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

5 g4 W% ~; g5 C1 y

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

; a6 Y& ?( K# I' {; |, E3 X: K

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

" |" y3 q0 l. r2 W' R% E) i

}

1 R4 J- T$ [" d7 d6 q

fclose(codefile);

: R! i) ^8 m v

return;

; A# d! C& [0 S3 K- l: r1 E

}

! Q4 P. K4 `: L/ q2 y9 _2 I! e* m4 p4 Q

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

: T r6 y: s4 N$ m* v5 B3 {

即获得码表文件。

# w( X; \* v/ C" c; h

第二步 转换

, W4 _% B( Q$ _' F8 O6 g5 K7 m

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

0 G9 U) X: V6 m$ @" t* z% s) Q

//TURBO C++3.0

2 A6 r: V L* O7 f

#include <stdio.h>

4 G4 T/ i1 g1 ~

#include <stdlib.h>

* C: _. G& c! b4 _2 c9 Z

void main(){

7 Q! w8 F% A2 H* c

int que, wei;

8 M: ~: I: K7 u6 m

FILE * sourcefile;

, [; H V( d1 }+ u; D6 v* K& O/ c

FILE * tabfile;

% y" G) J5 S2 v! h9 L U y* L

FILE * destfile;

' x5 ^/ P; V' l( }- b: K

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

- p! Z: \' a5 R% _0 |% Q0 t* U! D7 W

//BIG5 码文件

' Q5 |8 K) T. z( G$ c' c

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

0 `" c& P) l' a

//码表文件

3 F" w& T1 n7 f; q% c! |$ f

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

/ {1 g- r% H, H! h) I6 G3 T- L

//转换生成的GB码文件

; A( x6 X4 `$ o3 W% y9 D2 B0 V5 Q

while (!feof(sourcefile)){

' Z% [% D- J5 _& y% x

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

+ H+ A6 U) I) X3 F2 v

if (feof(sourcefile)){

5 G. k* f" Q2 {3 ?# q+ p3 Z- t4 H

break; }

" { a5 q# ^4 w, C* Q3 I d

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

% c1 G: i, D7 |! i! L

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

% \& u2 z- c1 v @: I" Q% M

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

) S7 r2 @$ d5 i- y* e3 \! }* |: `

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

- Q2 X( @! v% z/ p

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

* J( \( o; i' ^0 F& P+ o

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

! l/ r h" ^$ i' j8 a1 O

+ wei), SEEK_SET);

9 ~$ m/ M7 B7 x9 v6 j) K! s

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

, ^+ n; }# h/ N2 Y* I6 X

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

, l& F! `* k1 d

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

) w: M, ?4 s( ]5 ~; P% x; @5 g: K1 ~

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

) m3 C) z/ t+ e9 P) \8 W

}

) t) I- p+ k/ @* s! w

else

" X% c) S) Q. k0 I' T

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

6 L* d$ ?3 g3 A3 Z9 ?

}

0 k# ]8 j+ D4 W8 L) ]( [6 W& v

fclose(sourcefile);

; o: K$ G' W. j+ h" Z, m

fclose(tabfile);

+ M. F9 Q1 X5 Q6 _- ` T

fclose(destfile);

' Q% X$ B+ e) ^7 m: P7 z& U

return;

3 u5 m Y" E+ s

}

! X0 p0 }! ]4 t9 g9 g8 @& C/ r

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

7 x0 H# H8 R! b

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






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