QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

5 k% O* v' E1 R8 b- T: \

; a/ Q! n: r3 D+ R! L# M

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

0 y/ Q3 C( P, x, z6 @% S7 @

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

# H: Q: ~& w/ P( M- x, X

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

5 H! h0 M) ?; x2 z

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

& K% W; D7 r" u" G8 [4 P% S. @

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

) c0 |& I/ U2 a6 u, d+ w# C

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

) @: \4 z) W6 q) p) p2 a2 d# D: a

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

* ?7 C0 g; w d

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

) U7 o2 P8 n4 K3 }

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

& u7 e3 ~, P5 d7 n3 c; I

第一步 制作码表文件

8 t2 p* e, J1 `9 i

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

( D, n8 k& b# Y1 J5 p7 |

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

6 q5 [1 |: A- y7 `

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

. o: m& t# j* k6 j8 l

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

% Z) B: e2 \. |+ e9 g1 i7 t

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

6 q* V" B# r/ B9 s( A

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

& ^8 s; e1 [& Y; _

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

$ @& Q& z$ q6 c6 x. S- F

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

4 M- g) P& p5 R% d; \: A8 E

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

" L7 n6 S4 m8 z! n

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

+ c q# H% _, q

TXT”。

1 h1 e8 {, X. V* q

//TURBO C++ 3.0

: L7 G ~# V z9 J

#include <Stdio.h>

2 ?; R' Q! |& P: _! T6 J

#include <stdlib.h>

9 Z. k* Y" u* w5 ]0 u

void main(){

1 T* j) v2 g6 [

FILE * codefile;

1 m0 U0 N. Z7 w' _" N' R/ T

int i,j,k;

, T; v1 A/ X0 i7 s) i/ B+ v

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

) T% c& o( e9 c/ V# X/ H

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

, ^( ~. ~4 u( @* d. ^. m* _4 G( W

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

7 b% b4 z4 K9 L

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

5 G$ n, ^# ~; o w& P% `. a* P

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

! w# }7 m8 `8 ^6 i

}

) [$ H; g7 @7 ~6 h

fclose(codefile);

4 T N5 ?# e; ]& Q4 Y+ q3 |. z" c2 a- g

return;

& o* F# v8 F" u2 o8 j O7 R: ~

}

, d2 w1 s+ _; j' z" h- }1 Y. a

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

6 D( V" X) z2 a; V% S6 a

即获得码表文件。

- }5 ~, \$ V7 l5 \4 e# Z

第二步 转换

' ?/ m1 s$ w% d) K/ w5 H

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

0 C. d% u& @2 h1 k% B9 f

//TURBO C++3.0

9 v! k9 Z5 |' q' ~! L

#include <stdio.h>

* w: f2 {8 x+ R5 L1 W" U

#include <stdlib.h>

' I4 U8 d& [5 |; A9 Z

void main(){

7 v) [ h- S# @- y7 b2 s+ E

int que, wei;

2 g; X" v1 Q! z

FILE * sourcefile;

M9 T1 v' A# f0 T/ {/ O6 N% |

FILE * tabfile;

- S" M& @: @ n2 C6 q. l

FILE * destfile;

. r' d/ }. T/ l7 ?; P0 W; k9 \

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

* J5 o2 d- @* _# A' ]) v

//BIG5 码文件

% f! K$ l. K* {* @5 M- I* [

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

8 R+ l+ M* J6 |' |, Z D$ i8 R

//码表文件

& Y9 g+ t$ d. j/ F$ t& S

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

; j5 y, j! X$ i/ N" n* T V0 X

//转换生成的GB码文件

" w2 V& Q( x* [" O1 ?# N

while (!feof(sourcefile)){

* B2 p; V4 [+ w, P& ]7 J. S

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

9 l1 `* x8 m7 [% {. W

if (feof(sourcefile)){

9 v. x( s& i0 P9 z, t

break; }

" ^* n; U8 t2 f

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

% d+ `; S: Q1 b

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

2 w% _9 m- Z' e! M

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

( k; @' A6 J0 ]! {3 G

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

" }2 p. y [( B7 l/ i

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

3 ]1 w0 n" j) q2 \+ |( F0 j3 ?0 X1 d

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

6 x2 `) l7 B4 j& E5 x

+ wei), SEEK_SET);

7 ~$ X* e, Z) j8 B9 ]

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

z5 g, E) B5 s

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

+ B" S1 {7 d& x% |, {9 k. Y8 ?( c

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

1 r- G+ V* Z/ f0 H d/ A8 _& _5 p

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

1 Y+ W! J9 ]+ z1 u$ g5 B

}

D! b) u+ ?, x! F( W! X5 N

else

% W0 s$ z/ l5 m7 L1 K2 l

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

. O# o5 h. W% Q" G, b L# U1 A, [

}

0 @$ D [/ w, J( Q

fclose(sourcefile);

0 k+ A* r+ U# _6 Z

fclose(tabfile);

, _2 c/ g* c, |' B# M

fclose(destfile);

8 I8 j f4 O: X

return;

* {1 x, {, K/ H4 H @5 @

}

: b" T4 `6 l9 f! i" l, H8 |

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

8 o8 h& S: K m* ~: _ `2 ]" @3 F, \

同样的方法,我们也可以将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-20 07:13 , Processed in 0.399821 second(s), 52 queries .

回顶部