QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

) _8 M, I+ h7 L, S% l" t

/ P w$ X% X7 ]) t9 s. p% J

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

! y5 Y7 B+ j! o

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

, B% }+ J9 Q+ O7 k8 r+ C

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

$ f/ D/ ?+ p# C1 ~: z, a

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

9 n: Z0 M) E- ]2 U5 ^+ n9 W l0 D

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

4 V% T$ Q3 z4 d& b, V5 W4 ^% O

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

1 [( J6 a; V1 u/ A

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

6 H6 [6 V" \' a, M0 o! k( ~1 k

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

; ^8 Y( \. b# L0 Q7 V/ |% w

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

$ x. w, P4 ?, D9 Z. }' m* c

第一步 制作码表文件

% d, U# L! `' x# H7 Q

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

' ]5 M* ?4 t+ G3 F( y9 N

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

: r# V; f: o+ ^; s( m* ^4 n

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

1 Q0 i& c9 S/ o( q# e" S% v

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

) B+ Z4 L" e( K

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

2 c. G: [4 I. ]6 y; t+ V: d4 i' Y

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

) d% Z/ g5 i1 u; A3 b! {" l. d7 R8 T

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

% j* ]' B/ E. i/ r1 n7 m: t& T

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

9 m! N1 J' ?# q1 S, v" i

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

/ R* n! m3 ]6 Z' P1 d- x. J. a d

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

+ H5 o9 [- F( r' m; |

TXT”。

% { L3 x: x% }* a; N& y

//TURBO C++ 3.0

5 V. s, W/ S, _& g/ {

#include <Stdio.h>

* K3 b) `& E) H3 r

#include <stdlib.h>

8 h4 [3 P8 T1 S9 n1 _0 f, z

void main(){

) M; p; Y. G' Y' u/ y

FILE * codefile;

, p& M* v- ]# q3 L% z

int i,j,k;

1 P. N# w) i7 M! c& ~$ k% d3 i4 l* V

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

7 A/ l" q8 `6 L# Z! D8 i

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

' `0 M$ c7 a# Q1 C) ~: c+ W

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

$ B% o! o8 ]4 M3 P

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

+ x/ q" M) }( b' J c9 a$ W! }" I

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

2 K5 K9 S0 b$ g- n: W" `9 x1 F

}

7 D5 D' y3 v0 K- i3 g$ ^

fclose(codefile);

: q* J, v! H: \+ k$ h P1 X

return;

3 E/ _, T. e- t

}

$ B- `5 ?+ d) W4 {# T: {# R$ M" o

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

$ V1 w& w& N- ~! D4 z7 F$ [

即获得码表文件。

5 z, a2 T' y! T$ }) V, A9 c

第二步 转换

7 ^9 a8 C9 j; K) l" N8 m+ A

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

/ g4 `- W# g) M0 K- `

//TURBO C++3.0

4 F) f. F( p' M

#include <stdio.h>

! A- X, l+ B' Q6 |- X2 @

#include <stdlib.h>

% ~* k. C, a8 R

void main(){

, U/ A3 s6 X8 ] C

int que, wei;

' x# e* Q8 z2 c9 ^6 r% n8 o

FILE * sourcefile;

" U* Y8 u0 i) S8 R

FILE * tabfile;

) V: @' \% W0 `1 H

FILE * destfile;

+ K. \2 `- u% N4 F4 o

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

) k& Z0 B' r) d' i

//BIG5 码文件

& t$ s2 B; L. a7 R5 k6 r9 I

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

, d% A( R; c D2 ?

//码表文件

8 b! O& S$ |+ L- s1 S$ ]

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

8 e7 g& ]! r, ^* l9 H/ H6 W3 D

//转换生成的GB码文件

) ~! l9 h0 _& c

while (!feof(sourcefile)){

( S! B1 b% W- L: S, {) T' `3 ]3 A

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

8 L3 ?9 g6 W8 `* `9 F: l

if (feof(sourcefile)){

) B6 H8 a3 M' l

break; }

/ C1 ]; ^6 L3 r$ D% [

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

' { ~4 J" E: ~- b" ~" n/ N

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

3 A. t4 S3 w$ H% C4 V

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

9 C+ N# ~1 q& X% _/ v4 @7 [8 X

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

, Z1 U( H, a2 H3 e

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

' J7 ?6 a- t1 F, ]

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

# g* `! V: Y# t: s) L' W

+ wei), SEEK_SET);

' h% K! z! L) P

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

$ {* A2 g, G$ m( J1 z" m# K6 m

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

$ N; ]* c, z l: u2 z

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

; e1 t; y+ z+ H

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

3 e9 `( V- H: T; K, q

}

. M8 z$ b) w) J9 j' @

else

2 X4 j+ k" Z3 @+ o) ?! N

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

' C9 ]7 ?$ N2 B3 _4 }* \5 F7 k

}

+ ~: j+ n# i- u# s) t& n8 a

fclose(sourcefile);

+ F9 f. `5 w6 J- D

fclose(tabfile);

( n7 u# a. e# i- [8 t6 R3 g

fclose(destfile);

2 Y$ I8 R4 q. m& {

return;

p+ l9 y% u, }" j* r- V! [

}

7 l% h: F5 q: F1 K) V7 i

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

/ E i7 d' H1 j6 G

同样的方法,我们也可以将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-8-9 10:17 , Processed in 0.307439 second(s), 52 queries .

回顶部