QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2782|回复: 0
打印 上一主题 下一主题

BIG5到GB的转换技术

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

BIG5到GB的转换技术

# I' ]# L' O) W: A9 ^

5 Y2 s. ^0 q+ o0 g6 O+ l) ~

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

8 q$ Y$ D) V2 m% M% k+ d9 N

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

& B3 U. `# {" x7 l. Z8 g% |2 G

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

9 V e' E5 V$ b2 ?/ D, Q' e" G

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

4 x; U( ?% M- h. G& ?' H

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

. E2 r/ F6 V t' B" F I- v

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

( c1 q2 J1 t) i4 c. X s

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

% D0 H* I& x+ P0 j

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

" _, e" w# }( k8 u, l

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

+ h. h! v8 S. M% X0 c+ C3 ^

第一步 制作码表文件

6 w. P9 a# h Z8 _- C8 D( A

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

7 K" _# X( |6 A, | c; H5 n

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

& o- D3 s' l2 z# Q) u

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

# B9 N, J# j7 j- g; U$ J- F9 t! v8 g

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

$ S9 `0 x1 u4 y; k% h

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

( _3 |' ]4 u& f6 }

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

2 n: A. C& t( m! _

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

0 s- B# o% C: D/ B1 Z& G B- ]' N" d7 ]7 W

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

3 T) w& F7 m- |5 z2 |; y

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

' o1 ]0 X" T/ C+ c) R

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

( ?1 z( B# b) ~0 ?; @0 `" i. Q: o

TXT”。

& y Z0 ?8 N1 ^8 M+ G& D

//TURBO C++ 3.0

' o5 ~9 @8 G8 Y" y

#include <Stdio.h>

4 u! }' r; j' N7 ?; |0 l$ G3 l

#include <stdlib.h>

6 k2 P% c9 ~5 h& @1 j, y, B5 r

void main(){

2 G9 H3 V7 K/ x* x' `1 J8 _

FILE * codefile;

+ S6 C- r9 U+ v4 K! ]0 H" A3 Q, P! L

int i,j,k;

6 D* V; y; d2 T6 X+ ^& d

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

: W; @6 M& O# A* ?% D& \6 q

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

& N4 S. {5 I* X; A) `/ E

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

; c# f( V& t4 U9 {; ], u

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

t0 w% @- h. p$ ~5 ^' Q& z

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

$ F6 e" A" g4 w

}

' I/ M9 _1 [! }

fclose(codefile);

5 R1 ~7 u2 @! M

return;

( t* f3 o& P2 R7 H

}

- Q. h! G! @) H7 ?4 d' ^3 v

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

# o/ N4 {# C6 F# Q

即获得码表文件。

$ }/ a: ]/ K9 G4 D4 e- N

第二步 转换

/ P0 o2 H# P4 Q

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

0 c! }. M" n4 N5 x

//TURBO C++3.0

' K' U* L$ A; Q# q/ V

#include <stdio.h>

1 H5 l8 D) z$ R: n" M$ V

#include <stdlib.h>

. L$ O/ x, M/ [) H) p: p

void main(){

! q, q7 M. g) k, w

int que, wei;

5 g- m: F( H- k5 ?

FILE * sourcefile;

6 g7 x! @3 Q) V& s# L1 {, g0 n

FILE * tabfile;

V7 B( W! {2 u: X0 F2 M7 D/ \7 i

FILE * destfile;

7 j8 A0 Y% S C

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

7 n- h, X, a' U6 F! r/ W

//BIG5 码文件

7 ?" N6 q& C) a4 D; A

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

& Y. W& ~7 v4 c8 f( W" p" @' U

//码表文件

4 u, o/ \+ x7 [4 H. D6 A3 Q

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

. t7 C* |3 L! f* n/ b

//转换生成的GB码文件

4 M8 h9 _/ |" G9 i$ C

while (!feof(sourcefile)){

0 D: c3 V- v0 Z

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

- e/ C+ C7 ?! z( w' t5 ~& |

if (feof(sourcefile)){

7 T9 u6 ~1 X% `, g

break; }

+ Z4 k! v# z, Y7 Q* w: n- l; O

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

- x( W6 _2 u) o" X1 M: W/ b

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

! x) n( v% E8 \: t, M# C! w5 y( \

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

6 O# q/ |, X# {6 l

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

; p& ]/ s) H- B% z

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

* `, e" ]# a; X [0 u& ]

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

% ~% `' G& U0 n# v

+ wei), SEEK_SET);

+ b/ b/ y$ d2 W6 w! c# F2 ~

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

0 K. j& f8 _ K; d" h5 j2 S; i

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

5 l2 s X# h$ h' E

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

4 X+ w) C5 r. V6 Z* n8 B

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

! g, A6 Y. r+ |3 J1 I5 d% @8 ^/ W& y

}

2 d7 R/ ]/ @4 r# b- C

else

; N+ f! V% O- A4 w2 ^: }

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

' h) p! U' Q' R% @" i

}

* s7 D6 u% ^9 m) H+ [# U

fclose(sourcefile);

+ n: }/ d# L* j$ y# e

fclose(tabfile);

- r% K0 x5 X$ P" q

fclose(destfile);

" V4 S& ]' Z1 ~9 Z% w

return;

* P4 p* T" E+ ]

}

$ ?. N* C- ~& d9 l3 G

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

% `2 `! ~4 n! B& r/ A( V

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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-18 10:44 , Processed in 0.371318 second(s), 52 queries .

回顶部