QQ登录

只需要一步,快速开始

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

BIG5到GB的转换技术

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

BIG5到GB的转换技术

8 \5 y$ ^0 j$ w

; D# f5 y# O1 N; M( R9 s

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

2 p2 v, _! n8 L, {3 ]3 J/ G) T

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

/ \) r& E6 X8 ~3 X

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

& f; C) D* s8 g9 n7 o, T

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

( h; N Z0 h# W* o$ L; x

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

: p k( d' C F0 V( L

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

7 A% Q$ f) h: c) A# D$ |

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

! r' ^1 w1 b9 W

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

" Z" I3 G+ z' D( S

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

( c' a: ]% `! C

第一步 制作码表文件

$ s; @+ v5 w* M- [4 Z5 T8 U K

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

! N6 F5 S2 D1 N5 s ~8 u

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

8 |0 ]0 d% ^. \( l

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

2 y( K& i& r& z8 D; g8 G" ^% Q

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

* y# U+ O' Q* y, ?

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

3 P: h0 K: ]) D8 `+ }+ i' i0 d

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

1 m5 u0 e" @: N! A6 ]1 T$ ^

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

1 q9 [3 \5 _# W# ?$ s H7 b

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

, |( d( p7 [* d: m

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

. h% |* U2 c# N9 s& j

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

& u; I2 X3 V$ R1 M4 d3 x( I

TXT”。

: @( b N' w1 K: e8 c6 l+ B

//TURBO C++ 3.0

$ j' i% D" L7 K

#include <Stdio.h>

; [6 b. V* @+ g; x5 F6 r h ~

#include <stdlib.h>

" z& M& L! q% p5 ?2 Y1 H

void main(){

- _0 h) R- i3 k% r1 Y& Y

FILE * codefile;

6 N; Z& q( R$ o& T: X: Q

int i,j,k;

, z* ?* D4 h) M C5 [

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

8 G% {& a; K4 G5 f' A

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

8 e2 ]9 k4 t9 d# b4 n% b

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

) o8 _& ~$ K. e1 ?9 g9 a+ b

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

# o' I. x! m" K9 D

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

2 D+ q0 q- A$ s1 e9 s6 e

}

4 O- E( Y0 }7 M) Z% _# A

fclose(codefile);

- k% b0 W2 `3 o. T( I+ _. C1 |

return;

, I, I3 E: P( r3 y+ M9 h

}

! c+ T$ L1 E9 o/ [

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

1 Y3 a! J+ m+ u$ O# y% l% D F

即获得码表文件。

8 h& L3 t! b/ G# \7 d% c

第二步 转换

6 F& p3 c( s. t

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

, R. b0 G8 M, j6 A

//TURBO C++3.0

" u8 z$ e( k; R. W) [* o% N

#include <stdio.h>

# }: K! I/ A! {# n7 u! l" Q: f! t

#include <stdlib.h>

- u0 l7 |) a) U T' {

void main(){

5 ^/ I& o! X" H0 i$ j% q

int que, wei;

7 i# w% @( h" X/ x: ~5 q8 U, A

FILE * sourcefile;

. _) `3 G; Y5 ]; P, j! C' V$ a3 k

FILE * tabfile;

9 Z/ r' R" ^4 B2 y

FILE * destfile;

4 G8 b9 K6 w8 T/ I

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

7 q8 M. d$ H8 P% D* K

//BIG5 码文件

4 R( @6 v" K: Z5 j3 ^+ v9 M+ K, Q5 P

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

1 s! b8 v/ X' A3 j9 W% k0 u/ `

//码表文件

5 z+ `1 D; P) }6 W- g

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

$ @" `( R4 A4 e+ q/ C$ ^

//转换生成的GB码文件

, j9 M) e0 C& c' r

while (!feof(sourcefile)){

% E% O% A. @! q" {2 I3 D" |" d. X# c

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

. Z6 l- h9 f( K. K

if (feof(sourcefile)){

f8 e$ T" }1 q

break; }

' X' ~8 t) m, A% q) N- B/ D* R

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

" Z8 `0 s5 A6 d0 H6 w' G

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

( O, X: e1 r2 V- W

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

9 P* h4 ?3 {) S3 B

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

% i! t$ Z( w9 {" w% X# f

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

+ T0 j2 S7 T6 `' u2 h" p2 u W! x0 k7 g

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

6 N& }& c4 }/ k5 R4 r

+ wei), SEEK_SET);

$ j6 P! o" m: M( e

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

8 R8 e0 q' G0 r- {% i

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

: _" X0 H C/ b2 D8 D

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

% k0 J0 E7 h! c; ?* u3 P2 \: p, z4 W

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

+ v* d3 E" ]* a' N' y7 A

}

3 m# O3 k3 r% g8 p4 I

else

# v& s1 A6 p; h& x

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

# V3 }* j, X! A. l

}

! p B7 [" s" C3 r& U! ~4 e! i

fclose(sourcefile);

3 I- _5 a- [7 U e# S; u

fclose(tabfile);

! _, z* T" s+ h" w. L

fclose(destfile);

$ I+ g" f4 x8 }2 N/ {" C

return;

7 A4 _+ K \ A1 l

}

0 d1 D$ T( }* ^3 y+ D' k4 u2 V

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

3 q0 { e; J. D7 w! D1 M5 e

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

回顶部