QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

% m/ W) Y' g+ A

: F! j5 g9 ^8 ]- h( G

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

! E( `8 I9 _" |6 g$ Y2 v

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

) M3 y+ c/ I5 K- I

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

3 z1 S* A6 N5 A& H* I

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

# d+ T$ X, `+ o+ T

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

/ X$ g5 w6 v1 G

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

% D6 Z0 N. G V* `6 U

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

7 @3 Z. g" {' z8 d' H

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

) \! i, U) |0 u* W# G% ?" U1 A

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

; l4 I; d* Y0 t

第一步 制作码表文件

: k' z+ M) w! f) K; k& z

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

& F1 t5 b, H6 y3 L

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

' l* g1 N6 y8 \7 K& ^

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

3 Q3 u/ {- ^/ V: K* h) X

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

" }5 ?, ?" B S7 M, _8 F

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

/ m+ l4 c9 v" L6 o+ w

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

3 y9 R% C* u& c0 C" H

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

- C/ M% q, ~7 U8 J

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

& P b' x1 x/ q( V1 O3 j

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

* E5 H3 @3 D2 b

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

! L7 t g+ S0 ?3 M& V& ^6 N+ b

TXT”。

2 p3 I5 c; c1 t- l$ C

//TURBO C++ 3.0

m0 k/ l! s+ u$ B) T+ V

#include <Stdio.h>

. e5 l8 V P7 d" K% s% D' i

#include <stdlib.h>

9 {7 J3 e5 d) l) W& p9 h

void main(){

. j2 [$ I6 \1 {5 N# }% C

FILE * codefile;

6 Y) {, o: l( f* s5 Q1 m# \: T$ \4 O

int i,j,k;

, q3 k$ O- t I$ p7 J; S% i6 F

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

$ q3 V4 ]% f3 @

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

1 h" Q2 @; D% `

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

6 e% J* O$ C# N0 b" {2 D1 N

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

. j( ~( c. v, d" j8 |* F

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

8 W1 p! `) P# o

}

6 \ \! r* D6 ~) G1 O

fclose(codefile);

( I( ^5 A$ e/ ^9 q) B! z

return;

9 M8 i' k5 L9 X4 L! g

}

. G8 V0 M4 [6 O

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

: w. q. L& p8 X# M7 H0 C( d5 K/ k8 i

即获得码表文件。

4 ~7 S6 X- \5 H' T0 J, q+ t

第二步 转换

. i. B6 T7 w9 m: O

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

1 u1 y" }0 q) s2 D- @

//TURBO C++3.0

; [4 i* a# y# t- c9 h; T- t, M

#include <stdio.h>

) \ P7 q/ F0 Y c" D4 d0 L+ X

#include <stdlib.h>

1 f% F F, @- V) w) A$ E( T& d0 N

void main(){

; Z0 I2 a# J" I7 ?. Z/ J

int que, wei;

: L: ^, k/ B9 f3 V3 O, h

FILE * sourcefile;

. z* V0 e [& Q- i! Y7 c* @

FILE * tabfile;

& O# p/ ?9 l, P

FILE * destfile;

) B0 }, E i$ K! |8 [; y

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

1 H6 E6 @- j' T! [5 ]* H

//BIG5 码文件

8 q9 y- d% n& s+ W' G

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

; w* a) y. |1 Q

//码表文件

3 z b6 U8 z' r! E4 o$ g u

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

% X+ ?) M6 U O+ e

//转换生成的GB码文件

' [, y1 s) S+ L4 @2 |8 h

while (!feof(sourcefile)){

0 t1 N9 @3 ~) q7 i, @) j

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

. q2 E) B6 i/ y8 i% s I* D

if (feof(sourcefile)){

. I+ F$ h1 `" e& [; Q* ]0 M7 E; R

break; }

5 }9 c) N- T' C. \" F. P" a

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

# G) r) H3 B5 S: h: k

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

T" J' u5 j8 P) B6 l Q: V

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

3 g( {7 |% J& ]5 _6 L3 v. R3 ]

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

# `" W( x# f) a

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

& l* l) G$ P/ }0 F3 v+ g

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

6 e$ ~& }) D w* z

+ wei), SEEK_SET);

! q7 T7 v& d8 i: v

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

$ N' l3 j: S' `$ n! O( R

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

2 g3 Z4 w" |4 o( x' K. p

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

+ w" _. J6 w3 k" E( a, l! c

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

- v: u, Z4 s2 I2 u( z1 U; o

}

+ T! g: Z6 ~5 J1 b% Y' c

else

% N0 W# M7 I- y5 z1 ?

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

5 h2 W: ^& Q3 B3 l% \% t

}

' f, X. k" k F ?5 n* O

fclose(sourcefile);

6 M( |( I8 U- W6 ` H7 W0 k

fclose(tabfile);

- E4 s* j9 C. u- I- I$ ^7 k

fclose(destfile);

( e# o( ~- p+ C$ O3 K, [

return;

' z4 Q" l6 V9 a, a

}

* @" F# \( o( ~

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

4 Z5 a5 W+ K$ G0 R: q3 r1 V, g8 y

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

回顶部