QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

6 W2 e: n8 A+ A% G9 {, G, i

7 t! G& h/ b/ u

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

2 b5 s4 L1 [& j, [3 ^: H

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

, P6 B1 ` x L3 J* x

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

- {" x9 Z! w' c( b# i/ L5 g1 F& X

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

2 O" B! y1 \! K9 a, V) K5 v

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

) S" W. V, ]1 q

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

6 @$ P9 Y$ [0 J! v5 p0 g2 \

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

% ~1 r# M! M7 @( c& Z

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

; r6 g' i' H. W5 i% z& _

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

3 |9 _ G2 r0 I3 o f9 _# v

第一步 制作码表文件

! k: o4 C6 }. t* l$ w0 S9 g

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

0 t2 z# C3 X5 `: G1 F7 c3 X$ i

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

6 n: T1 {! ]- q( _0 F' @: E. f

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

, n* e# s. {5 r/ e+ W. e! v

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

" p, b2 Z& _9 J9 C4 h* d8 v

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

. m; O1 Q) a( G& @0 x z0 g' j, f H

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

X# d# Q5 W! K, E6 b# i# F

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

9 G; r; p) ?. Y! k' } B% b. _

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

# `* e0 r. L1 t) a- r+ Q+ }4 E8 X g

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

- M+ p1 ]4 s# [ K, z5 g+ m0 A @

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

" S( F( j5 J# W+ G# C! X4 e

TXT”。

" h! I3 a4 y4 ?9 ]3 k# I

//TURBO C++ 3.0

0 {; p; p- I, k+ n; _ }

#include <Stdio.h>

J+ b! W2 P1 y6 z8 ^: ^# A5 [

#include <stdlib.h>

6 ^: {8 G; |2 |- a; h1 k G

void main(){

) D( P0 p- ?3 @

FILE * codefile;

6 G% X$ U* [: N" D$ t4 @. u ]

int i,j,k;

; r c: V0 Z/ `5 r$ `8 F

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

7 [0 @1 W2 A2 @& k( D9 Q2 g

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

+ d0 l" W& G0 G8 {

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

! a* _- B: h* [

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

' o1 ^' ]5 h" S4 n) z" G

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

: W0 |, U8 g# [. ^& G

}

* o5 g+ m' S$ E3 I) d; a9 i. Y6 n

fclose(codefile);

+ D. \' o' @+ B- a

return;

3 ]2 q; p! ]. v6 v) X

}

" V8 I5 a' s: X' ]7 r

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

( }: Q- W4 l' A

即获得码表文件。

3 U/ v3 G( j1 e" l

第二步 转换

& }; }5 Q6 N/ I

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

b( w% ^; J3 Y/ k3 W

//TURBO C++3.0

! I4 _# e6 d2 \$ U0 k$ _

#include <stdio.h>

7 w. G& x1 v( T. q! X2 G* p# l( P) p

#include <stdlib.h>

6 F( U* {1 I4 ~1 I0 x) K) U6 V

void main(){

" Q8 ?2 l2 k, R6 }

int que, wei;

+ U/ E4 j8 ^ Z ?

FILE * sourcefile;

6 W1 a3 \" ~5 \4 s/ G# ~

FILE * tabfile;

1 O5 K* l! ^+ @

FILE * destfile;

# B! j9 D$ G# t5 J

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

+ Y: h. }9 r( u& \$ g' [& u/ d' q

//BIG5 码文件

: ], j& s5 e- _# ^& d8 q# a6 j

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

7 Z3 h$ b* ^4 O

//码表文件

: F% U0 d( O9 G2 e1 K5 ~, S

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

8 Y; K9 o! g2 B7 b4 P) y6 E# F$ K5 [

//转换生成的GB码文件

6 G- Q) U \* V( A# W) p7 O6 k

while (!feof(sourcefile)){

. D# a0 j. k1 s$ i' c

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

* K8 P% E/ j# R4 [$ F- n

if (feof(sourcefile)){

3 |2 U( b0 W# V3 @

break; }

% e" e. o o7 f3 j

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

' x6 I0 H, t( V" `" }$ [7 j1 c

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

. G* q9 N0 V! O9 {- R T

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

1 J d7 U: Q% d- q/ p

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

) _2 ~0 a" F& v8 Q0 K- {

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

+ ^& F$ G1 J- Y/ Y5 Y' l" e

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

/ @ D5 a, o2 e& L c7 H

+ wei), SEEK_SET);

3 p3 [( g+ A1 C

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

' ~) i9 C G$ b5 m- ~) r

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

6 k# ~2 G7 `/ }! _

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

, j4 {# ]* `* p3 g

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

& X' H' \5 F* K( F( X1 G

}

- P9 i2 i& f9 q2 {% j/ ^( H

else

: l2 W+ h o. e! K$ `1 G' l4 \! {' ~

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

) L% C+ @/ F) c* _3 l

}

: n3 f" q' ?5 t& [- z

fclose(sourcefile);

" X' U3 Q F7 P0 D' ?+ c, _2 V

fclose(tabfile);

8 l3 w# q! ~6 M B) l& C7 [

fclose(destfile);

6 `( q @* i d6 d X9 ? l

return;

5 R$ W: ]/ }, Q: z; y, G

}

8 Y) w( s. v) G

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

- [# L7 _1 z+ B; {, 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-6-14 04:06 , Processed in 0.424750 second(s), 51 queries .

回顶部