QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

3 M' N7 P3 A% d! Y

+ t( ~+ J9 i4 \5 A

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

5 z7 t/ [9 b! h( u- m! |

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

7 u& y3 I. H5 Q% ~ g [

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

4 R! M; K1 ^( g0 T

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

, ?) e+ }7 r! y7 e% J

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

O8 T! R9 w6 U5 K2 u/ q" {4 @

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

. ~! C5 ^: y5 n: F* {% l. Z

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

$ b1 C- |( w: G

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

# u' p6 n/ F9 ?% R! P

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

- T: T M# U& U

第一步 制作码表文件

0 `. X' ^* @! N2 z

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

) o" ?4 S4 M$ Q& L) L3 k% u9 B

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

. Y0 U/ C; }' o) g. z+ K D

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

' g4 Y) ?, k; n7 L& E* f- t

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

0 w' l' K1 b$ r/ j; |, K

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

$ l% u, ?) s7 s6 ]6 O1 T+ Y% ?

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

8 M' ]8 Q+ ?2 u7 j; T* x

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

- P1 g5 @, S( t( v3 \/ F

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

0 B& ^7 s: p" t/ U

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

* a6 i- N$ w8 ?4 [! E- |

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

, N, h% M4 `5 s" f1 g% v/ _- p

TXT”。

' r5 ^$ e# R0 Y) [& ^- n" w

//TURBO C++ 3.0

6 K9 V5 a; z1 y* } h5 E

#include <Stdio.h>

4 c' a0 E# h7 q$ N9 K: ?3 u

#include <stdlib.h>

, P1 L( m/ b6 \% k! ]: U

void main(){

! Q9 [( v4 [8 ?4 x

FILE * codefile;

- T: L. t5 v9 ~1 T7 L2 c

int i,j,k;

. l( A& |6 K, G8 w+ K. s

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

# e0 `( M; y: }" T% m

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

% p+ v/ F6 F& Z

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

1 b* H' D2 f0 a# f0 }' ^. A

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

, H+ V) g; v: B) T, @, x3 v

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

, ?7 v' v" P) [, V4 O# d# F

}

4 W& D/ }( ^+ k. L' l2 S

fclose(codefile);

; v3 M+ `6 p. ?, [$ t

return;

. J+ _4 | o( k# I4 B

}

@' G3 C4 q* Z: n- v1 K

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

( D* n$ v0 ~3 i% O

即获得码表文件。

! S. K7 L- A" H! r

第二步 转换

% U! ]; s( r& \1 O# B, |/ k# @) M

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

v0 E" U4 G' ?' p+ s. W

//TURBO C++3.0

' A- y5 w; M! N

#include <stdio.h>

5 s0 _2 s. i; a) q3 q% R

#include <stdlib.h>

: _" A2 p5 |2 Z8 [" j W, e5 k

void main(){

3 O" L! a" `) Y7 w6 x

int que, wei;

0 b/ L" h' l( T5 |. ]4 Q3 n7 E, a% d

FILE * sourcefile;

x1 J, x6 v. d' a! K

FILE * tabfile;

9 ]: q- }4 q& M7 q9 t4 z1 d

FILE * destfile;

% j e+ h' q- e1 c! }9 f

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

4 i) a0 B' Q2 [6 G5 O

//BIG5 码文件

' \2 h" G! c8 x& ?

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

% q1 p2 J0 X$ X, B

//码表文件

9 s9 |& v3 m% a, g8 _$ K* w1 w

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

1 T: K' X6 o! c/ W! Z4 W

//转换生成的GB码文件

6 g* U1 ^' c$ }2 K1 U) g5 Y: D( o5 q

while (!feof(sourcefile)){

) w& e/ T: j7 X1 H' W2 A C

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

) m! r- B7 \$ z% m. J, e0 W

if (feof(sourcefile)){

+ L0 k- }; g- k: ]

break; }

" q) Z* Q7 y! g' k

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

- S! q P4 M: B! H- s; O

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

( }8 W. F+ z- a0 r |2 ^5 g6 _

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

6 M8 V9 T$ l) w$ z5 T

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

6 J, Y6 I3 ]% {' R

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

6 K, I2 o$ D( c- a/ k# k

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

5 F1 _; x; }9 O5 F( f

+ wei), SEEK_SET);

$ y O; \: [0 _8 R. G3 n

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

8 J, w# l$ P/ r* }' F7 g

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

4 B T0 g9 [6 n

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

! G2 g# S. y3 W5 |/ _# s8 e7 e

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

3 p' F4 d3 o5 Y# [" p

}

" [/ |# E9 B! u% y. _# l* R! H

else

0 }8 d+ R- M2 T& y0 z7 r

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

4 H; t7 H/ _! K- y, q. N' `& W

}

" w7 H5 q- T' ?$ v6 s

fclose(sourcefile);

: }/ ?8 e$ Y" C) _4 ^5 z& _7 U7 }

fclose(tabfile);

- S7 v) w$ _; `* R, w: N8 z

fclose(destfile);

7 |: N! E' u L7 f9 R

return;

4 z- Q$ T6 g7 J7 ]$ l+ |

}

* w5 D- d+ g4 I

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

" b4 h+ h' {2 z- D

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

回顶部