QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

5 k: m* n$ ], p1 m

* w; ` `2 G* C- _5 ?

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

7 N- o6 G7 M$ b( ?" s

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

- {$ [# m c: K5 y9 t

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

4 [) O- c$ |' d e b

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

: f p+ A, \* y9 K

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

9 O) J, T' R3 E/ k& h' H6 v

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

& }6 f |) N9 y" S1 O9 t. q

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

. T0 l ~. K2 G" j. I0 F

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

2 P% m* g; `7 S: T/ O m

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

3 w9 N5 `! {4 i( R4 L- E9 w% ^

第一步 制作码表文件

8 w+ k: Y. H1 J+ v7 H8 M

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

2 _* k, q' J \" F( x

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

+ B$ w. N* N; [" M

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

8 W& e! ~ U, n7 d; L2 ^0 w) r$ D

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

4 |- [7 K* ?$ K! z4 B: ~9 z/ i8 ?

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

- ]$ a* _5 N$ B, ^% O+ N2 f4 x

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

( H0 Z) Z6 F5 D2 `8 z9 o6 u" t

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

5 u+ k/ l! L c) z3 y- u- I: j

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

7 ^5 s5 r! f9 L, X: s( G! r! E

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

- r( C6 m+ L' d6 D7 P

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

1 _- U' {, z7 U/ P7 y, M/ r9 P

TXT”。

. |' P. `+ S n' c4 `1 y

//TURBO C++ 3.0

, V; s* K5 ? `- a

#include <Stdio.h>

3 ~# e$ `) N6 s, `5 k% u

#include <stdlib.h>

l+ S$ o. ~- \* Z( H

void main(){

& Y) F% {$ x7 v7 a" B# Q' E

FILE * codefile;

1 h! [$ |0 n- I5 f# V9 c& |

int i,j,k;

" K3 `) e* j$ O) X# n) m

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

1 W; U( Q% f- a3 V8 j" `8 H

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

, n8 J. j6 p! `. M8 M% y0 J

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

j4 L' g8 M8 B4 C

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

1 R4 u& z% L& O9 g# Z* A

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

7 i1 T- o. p$ v" @# G) L, Y* P

}

0 C' z2 K- |0 f% c+ k/ g( r

fclose(codefile);

/ s1 ]4 E/ E+ Z) m$ o

return;

6 F/ f+ f& n# z7 u0 g# G! ~

}

3 `- e6 {7 Q) ~8 O! M6 b7 I/ Y; I

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

6 B) D, K) M& B9 S" I* }8 L

即获得码表文件。

6 U, |4 C- d8 h0 A+ A- S9 q

第二步 转换

" U: u r3 M+ ~7 L+ Z3 `0 {

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

; S0 w2 m: X, ^6 Z% E2 ~4 u

//TURBO C++3.0

) ], X5 E6 n/ Q

#include <stdio.h>

4 V1 F0 {# P+ n+ Y5 V( X" n

#include <stdlib.h>

, X7 N8 j- @% b& H

void main(){

1 _% o) w' E' O, e: m9 \

int que, wei;

# p w% u0 \5 Z! t7 N1 ]

FILE * sourcefile;

# L0 V2 s9 q( x6 x, x* R3 ?

FILE * tabfile;

7 z" [ T" v# Q- R

FILE * destfile;

/ E e+ H3 [' j) B

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

# i3 }% a+ n" r8 S$ F

//BIG5 码文件

0 q& h' a9 A7 g4 ~+ y' E

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

0 y2 C" B0 d; X$ O' K6 ]5 Z1 d5 [

//码表文件

. u; g3 ?2 o% `

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

3 j9 i8 j# t* L) D! [% e1 D

//转换生成的GB码文件

" z! X3 D- d j! x$ L! S

while (!feof(sourcefile)){

2 X3 o+ _! o" {0 {. s% `

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

; {2 l0 K6 D8 m) Q t+ Z

if (feof(sourcefile)){

1 X3 R! K$ x c3 i: R% K

break; }

6 Z8 x( g. I8 K" e0 K G+ z

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

/ V* a x/ R2 [" ]1 S+ p% k

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

9 J: `- M! i0 v- J2 R: F- z

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

# Q& ]; `) K2 t% W4 P+ i

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

+ g: w @4 R; M6 k: L$ y. t9 ~

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

9 g! b! Y9 [3 ?

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

, S5 c( C+ I8 x# I, Y) J7 r9 N- C

+ wei), SEEK_SET);

% ]4 E7 @' ` [

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

6 f7 g5 |4 ]& l( i

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

% q+ s& u( `* w: H

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

* ~3 |+ v) l! Z8 _% H; G0 |

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

; e2 d- l+ E, u" K T% R2 ]3 U

}

. R S; z/ H8 {9 E; H. e

else

5 |( J! n- \# e, u& R

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

" A% }! V4 l( H% X& R% S

}

& Z: z3 |' y$ H3 F7 P

fclose(sourcefile);

- N, ^# Q6 X/ E4 ^. l

fclose(tabfile);

1 h) B7 x- v# k

fclose(destfile);

2 S( H# c3 I4 Q6 X& |2 _

return;

" }) n% I) }" R! b

}

# p* R; e: X D$ }$ r8 d; T* |( b

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

K( S% |- Y. u- ~

同样的方法,我们也可以将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-6-11 08:43 , Processed in 0.861028 second(s), 52 queries .

回顶部