QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

0 C. f5 |6 a) {( a; O) [) O* X) ^

8 p; \) n0 Q2 \; m$ m

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

4 v: y( u, ~; ~1 f1 P/ W. U+ \

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

7 c0 I! k8 Y$ J$ k' p8 |$ @

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

. ?3 d' J$ [2 S, w

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

2 y# }, z: y% {0 E6 a6 i/ N1 K

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

# C$ b4 G7 F& F- @2 R0 m7 D

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

" Y2 v+ e! T; n/ [9 o

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

) i" R8 s' h- I4 ?7 O% w3 i" J

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

$ F, ]; E( D* V2 _# k

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

) r* D- D% N4 u3 D" p, f0 d

第一步 制作码表文件

) F( Z( K0 s$ q1 S8 i5 l9 n

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

% P& K! a+ l$ f/ ^5 v2 p) T) y

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

) C$ E7 e( M4 Q! s$ @. w/ Y

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

+ b2 X2 c9 l: A. B2 I/ @

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

2 b! W# }- \5 j

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

$ ?7 t- F: e& ?& o& @

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

$ r1 \$ T7 @1 N7 g, U

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

$ y$ Y( `6 [1 f$ c4 _* T" U: h

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

9 j4 B, l. Z0 H& d3 l- a6 l6 Y$ j

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

' Q* t! l9 @) Z( `8 y, y3 K

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

5 D' |+ E$ F* o5 D

TXT”。

3 [: H: G3 T# I7 X

//TURBO C++ 3.0

+ ~; U" E- T. M. o1 R6 a1 L$ C

#include <Stdio.h>

; m$ g4 [3 Z7 h, {; R1 |3 ?; d9 g

#include <stdlib.h>

3 f. D9 J+ e4 Q! _6 ?6 T

void main(){

1 Y& e8 n% A, t# h5 S

FILE * codefile;

9 f2 m. V# P% z& U3 f3 z' S2 v

int i,j,k;

7 U t; b; D" w2 L3 m9 J

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

b7 S+ _' H, v5 X

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

7 I, P3 w, c* P) |

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

m/ Q( i, |) p' {

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

5 w3 L3 O& g0 ^

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

5 P" T* d! j4 m- h

}

: r8 P7 A" Q- }/ V

fclose(codefile);

* H' K' |( } l0 O+ ~

return;

9 A: u0 X+ c! W- y8 K! b, _0 e

}

; h2 h# ?7 B4 [- e6 c5 p% y

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

$ Q0 V' \" |5 ^9 U

即获得码表文件。

/ P5 H8 U4 k% ~1 Q# g; _' c* H& f( R

第二步 转换

0 U. C- k; m. H

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

7 _6 A- h$ U% U4 P7 i

//TURBO C++3.0

3 M1 g! W; L2 r+ k$ [2 A

#include <stdio.h>

( t/ Z" _) I' O+ d

#include <stdlib.h>

+ g! @$ n& o- n8 c# Q

void main(){

) L X( u5 j, P9 a# r

int que, wei;

2 f9 u$ T/ t; \& [/ s( p9 x' G* X7 Z" D

FILE * sourcefile;

~2 n5 j# W- D" w5 c

FILE * tabfile;

; P( ~ k& t6 G, M3 I$ H. N2 r& Y

FILE * destfile;

' X! o t) {. h

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

4 Q" e c+ T6 Q$ r6 G# m g

//BIG5 码文件

9 S7 @1 [/ L+ B8 s7 u

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

4 O/ F, z$ }8 [

//码表文件

0 U# I3 C: S; |; ?' u& V7 Z% ], d

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

. e# c. j; o5 l" T! R

//转换生成的GB码文件

% N5 @" Y9 l8 h9 f

while (!feof(sourcefile)){

2 B q3 L5 j, @+ C1 J4 c% X) S1 q

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

* M6 M/ E* `& h7 |6 ~

if (feof(sourcefile)){

- [ g) {2 D7 W! f- Y/ z# S; c

break; }

$ J" i3 u, o8 o/ S

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

; R/ c g; C0 g

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

/ ^1 A/ P/ H4 v: j4 m! p

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

& e5 N" j, O# P ?6 o* E

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

4 N# K: m; @& Z- h$ o

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

9 X" a7 B1 m1 L

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

0 z7 n9 E9 x8 x: q

+ wei), SEEK_SET);

# z' O- U5 {0 s; z

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

( ~% a' x# w4 _+ Y* F

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

0 A/ L: j3 K2 H z- s- \8 [

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

/ }7 ?+ x: {) F) e

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

; g) G! _8 t, u2 C

}

0 @3 m8 I& j3 j; i

else

% a4 }& H# P! v, s

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

3 }5 p& x. M+ p

}

) x q. N( g; m2 s1 b: ]% _) c

fclose(sourcefile);

, W8 {. q* t7 `. I

fclose(tabfile);

$ b; _8 A ?- Q' n9 `/ u) B

fclose(destfile);

; h* ~* Y( d4 R( F4 H( k3 x

return;

+ R _7 Z. [/ o' K ]

}

: m h) e1 f. g1 k7 b4 t% R

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

2 G9 C! `/ 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 12:13 , Processed in 0.420224 second(s), 52 queries .

回顶部