QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

' S! O/ E" I$ d# i0 A) {, l0 w

+ x$ D, k+ e$ b, y

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

. H9 U8 e2 `8 _' G; e# m

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

+ D" @) ]) } J- a/ G; |1 [

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

# ?4 T9 ?- ?0 I* ~+ `+ D; x

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

: K& c$ Y# `( F( m( J. L& ]6 @

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

7 H/ _2 c9 R0 w5 Y

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

; M0 @! Z: r6 V8 ~

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

5 i9 V8 d4 f& A Z' A* \

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

: d& _9 \& t: H/ @$ {4 Q, C1 f

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

4 \6 J4 @3 s# |6 ~, D0 }- W

第一步 制作码表文件

1 m& i# G, D7 a

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

( X; x- _( M" R5 G- S: `3 G1 {6 ]

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

" ?5 N: d! n( h6 z* v( }2 [; y1 m

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

: g6 X& Y4 M }& g. U

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

8 U- }6 v' I, M# }% `0 S& r5 R

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

0 d' ]. \0 V5 C1 L, O5 C+ n1 K% P

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

6 l% ~' } O$ g. A

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

8 \" }1 I, a& w

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

1 J. s( p9 G3 F: d, F2 `7 w

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

& c) P% C) T; k9 e5 x6 i: u

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

- `" d: m+ h! k+ G# h) A! q

TXT”。

9 X. W) b, ^% y+ W3 h! T: z7 H

//TURBO C++ 3.0

0 ~& F) ^/ ]+ w! L0 ^" l! B

#include <Stdio.h>

3 L- n2 O. H/ Q( e* l: U

#include <stdlib.h>

4 I( ]& Z% r$ J3 M- C7 V

void main(){

8 N ^& t' M0 X* t- W1 j

FILE * codefile;

6 ^2 ~: A0 d$ \0 }5 d; @4 F7 n

int i,j,k;

8 G* C: x9 K6 g) |+ M

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

' ?+ K: U0 _% R, V# e

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

4 B% _4 V: U% [

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

. C/ m# @ u$ T7 @5 r) j3 s

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

& u, p& k& Y6 W0 { W7 v

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

$ v- R- a2 b2 W9 `, C% s3 d

}

+ U4 K% q/ r+ A8 z C+ u

fclose(codefile);

! @. E5 D: r- Z: q# }, j0 T

return;

2 o7 N; o- c* L/ c6 l2 Q

}

5 C4 ]( w/ D' \

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

- s' z0 S; U6 T( j% m& u8 c2 \

即获得码表文件。

/ @# U. {' i+ `2 x& O. D

第二步 转换

( C1 M" F7 l3 s$ C/ l0 B- R

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

9 ~4 Y2 W/ g5 }2 [3 L, Z6 A! t

//TURBO C++3.0

Q8 y4 T2 `6 [8 W) ~( }

#include <stdio.h>

- W* j1 D5 y+ {: u& D1 J3 }

#include <stdlib.h>

9 o2 e) j; U/ Y& s9 d# a# Y

void main(){

0 k5 t6 K. _! d: P

int que, wei;

! M/ K/ [, d2 Z/ N) m: W, E: [

FILE * sourcefile;

% Q+ l0 n f2 e4 }6 f6 C

FILE * tabfile;

+ X9 {1 F' j0 y: w( G- W

FILE * destfile;

( B$ n$ m. z6 Z# b

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

0 z) h* ^9 z7 R

//BIG5 码文件

0 t3 K( k1 h5 C) N

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

0 z1 i) ] g: h

//码表文件

! v R( G6 i! P! G+ u, U

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

' @- x8 ?2 X& B c$ i+ _7 x

//转换生成的GB码文件

8 i& o- ~: D$ ]5 Z' c+ A

while (!feof(sourcefile)){

# }' A! q: p9 O9 N J/ l; u m$ p

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

, ^" f4 |. Q2 r6 k1 {

if (feof(sourcefile)){

2 O, c4 s' u7 I1 ]

break; }

# V d; e7 { o5 ^* l3 v; _- @9 w

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

8 N P9 D$ f9 V$ [# S5 f( _3 M

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

( I4 o! B7 y$ o( Y

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

' p- q' Z3 ^! @9 G( m

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

. G; @3 ^( {) i; H

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

, F( c6 U: _6 } n* f& z

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

/ z. s- f3 D5 i" F, `; J! A5 h" w

+ wei), SEEK_SET);

y4 i; F9 q: T- @; e1 I

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

: g% \) f/ M2 i8 {# D) f- V

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

/ x& \2 L" y1 A5 F' V* {" x' ~' x0 p

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

) f$ s2 B* j% R7 {1 v

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

8 v' G1 g& l3 ^+ A

}

: _5 x$ y( j4 G

else

+ V) @' a% g8 X( j( j* Q( ?3 Q

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

R, D' F6 f) l# j

}

& Q. f6 E" v" I, W! W' g$ ]1 |& w; R

fclose(sourcefile);

& V( s$ r/ p$ F7 Q1 N5 r+ o

fclose(tabfile);

; l- P* D2 S+ O$ p

fclose(destfile);

+ o5 o, @8 S, [6 u% E" I& _

return;

+ T: u8 x, C) l

}

! x3 p" |3 W! n0 D

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

- e% M9 W- I# {5 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-8-9 11:18 , Processed in 0.396507 second(s), 51 queries .

回顶部