BIG5码到GB码转换技术
9 M( q7 }7 z+ J6 Z! {一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
& J3 X& j( ]( g* l3 N2 P
; N2 d# Z0 B% t0 Z 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。$ N* l. n8 g8 V* E t0 a P+ b. h: y
* h% z# \1 j) w" }+ M/ |
第一步 制作码表文件
& a E3 ^0 B2 g. V- P
: M, U* ?) i* N BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。3 _2 C6 a6 V2 s4 ~& b9 w6 l- j9 }! k
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。" L2 X6 _2 {8 j
* \% S' h4 v" x; f* Y3 k 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。5 Q/ I# x `9 y1 O+ u) b: j
1 c( ^) h+ o0 T% t( m. J
//TURBO C 3.0
& L; q9 [) r6 T- c* D#include <Stdio.h>
# g& l/ r u$ G#include <stdlib.h># y. {; G1 o" [+ N1 _0 R7 K
void main(){$ M* E! k" n- O, m4 {& g
FILE * codefile;" O; J* U9 ]" Q# r) Q
int I,j,k;
* S+ ~. W2 g1 E( _& tcodefile=fopen("table.txt","w b");
- }1 }. ]% A3 X- Q- afor (i=0xa1;i<=0xfe;I ){9 j; J3 P5 r' W7 x' i P* Q; `
for(j=0x00;j<=0xff;j ){! G1 D8 D. f/ r
fwrite(& I,1,1,codefile);- C$ l4 p) p7 q7 u6 x
fwrite(& j,1,1,codefile);}
) Q' C. m# V1 W8 P3 b2 o}) L F2 x g: O S G; V
fclose(codefile);9 W3 @" A( t2 u( [$ H* L4 W
return;& I% J$ @/ _7 B, ~2 ]) x
}1 e/ \, a: E7 ^8 f# b
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。8 }- i( k4 j2 ?* d. L" ^* n' a
+ A3 |: c. O5 G) N! |" S- M& ^
5 |/ G( B$ x% c E+ Q第二步 转换
' V0 i1 n- t" B+ U* W6 H+ q5 t+ ]! h O& E# U4 [2 m& ~+ R' L' Z
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
7 |- Q8 m7 I/ g: P9 X' y' r 下面的源程序,将BIG5码文件转换为GB码文件。, f& D9 ]* p% W7 B2 G/ x( Q
5 j- h: w' A, C& y( E8 |# s9 u
//TURBO C 3.0
' P0 I* `8 G' v5 e% k5 V# Y: I#include <stdio.h># ^# m2 ?/ b3 ^4 R
#include <stdlib.h>6 r+ h+ w, ]- j# r. C; H( S
void main(){
- b* d2 W' J, P: ?) jint que, wei;
2 w9 {' E5 j# P7 ?1 @6 M" gFILE * sourcefile;5 q4 L: k7 \8 H) G
FILE * tabfile;/ D, N5 L' S5 e0 B
FILE * destfile;
# N2 B5 l C# W& n' M% nsourcefile = fopen("big.txt', "r b");
F) a# h; A7 `9 @//BIG5 码文件
& o" l, G8 y( wtabfile = fopen("table.txt", 'r b");. ?* N7 }# M% X0 U5 ^3 Q
//码表文件
+ i* b% n. G7 {1 _! w+ vdestfile = fopen("gb.txt","w b");7 ]5 v) T' M2 r7 r$ [5 `2 i7 l C
//转换生成的GB码文件
0 |: u8 b4 B1 g( a+ h& z: ]9 bwhile (!feof(sourcefile)){( f" \0 k' V: {) ~) [& b. c0 ~
fread(& que,1,1,sourcefile);
7 {2 F* `: I6 aif (feof(sourcefile)){
! n/ X M, X' Q* Q' e7 X$ rbreak; }
! U4 I" b& F% O3 A/ w; Qif (que> =0xa1 && que <=0xfe)0 i; g$ e3 h* N: `
//叛断是否汉字(BIG5编码)
& D; \+ }6 [- Y% E' i8 a, {3 X{fread(& wei,1,1,sourcefile);3 O0 T) J- _* q7 q
if (wei<0xa1) wei = wei - 0x40;8 H- F) W6 z8 v: i: ~: E
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
3 g0 k% o( Q9 ?fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);8 q: _- _( f _8 G# z" c
fread(& que,1,1,tabfile);
: d& h# O# s4 I1 cfread(& wei,1,1,tabfile);/ _5 D; V( p e. k9 `0 v
fwrite(& que,1,1,destfile);
3 K- [/ \; Q2 P# [9 E; p+ zfwrite(& wei,1,1,destfile);( Q, i2 r1 D( I0 Q: C* ]- ^
}. m; W7 W5 t5 @! T; p5 J Q
else9 P7 [1 g. R) M) c
fwrite(& que,1,1,destfile); //处理英文
/ M9 f; V! W2 B" O# W' j}& W9 b) c& m3 ^- o8 S; L6 h1 x: D
fclose(sourcefile);
# I |2 z* w5 p) \' Kfclose(tabfile);
4 n" J7 b }3 U: l0 J: e" Mfclose(destfile);
. P* C' Q% L0 q9 L# g8 nreturn;+ @' K& b( _' L8 _ W) v; g& `
}
N7 t4 h& ~# ~/ m9 v* J5 H/ y- E8 N! U; Y5 T1 I9 `$ V) j5 p
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。* R5 E: ~" u1 \7 `3 O1 O
; Z( H o. U q- t- K, `, _4 l9 T l
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
K" b9 V2 \% I* s- O0 |' y, m1 f2 L
第一步 制作码表文件
|( s2 _6 @/ Z* z* ^( [
/ S; @" G/ d' w2 A# o3 f5 a- k0 v BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。2 `8 R9 q9 i2 Y3 h
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。- |- e9 w7 D) n) H
8 Q3 H! L0 t) g; G3 Y
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
# `! _( A I& w; W
6 _, z4 {. c. e8 o I//TURBO C 3.01 N: f w2 X, v( g! A
#include <Stdio.h>
5 r9 U0 f$ L) [! f9 J+ A* c# U#include <stdlib.h>
( l! D" b5 g( {% cvoid main(){, C- T& E1 n) [4 M) o5 h
FILE * codefile;
. I# ~ N9 V4 @$ `5 {& gint I,j,k;
; K& y8 P% w7 {codefile=fopen("table.txt","w b");) U/ m5 d2 e$ j$ N$ g
for (i=0xa1;i<=0xfe;I ){
6 {6 l7 V3 [( A1 Ufor(j=0x00;j<=0xff;j ){
+ b$ c" o' l4 N |* @9 Xfwrite(& I,1,1,codefile);
) ~4 x: x8 \7 h0 O, O! Afwrite(& j,1,1,codefile);}. ]! q0 `, {6 E6 Z: h# e
}
. ^& H( m7 N8 cfclose(codefile);! X$ q x+ w1 i& D% B9 S& p
return;
8 b0 l4 p0 h) v4 s. G1 k}5 C0 U- k4 f$ }$ L7 \/ }+ j8 @1 p: z
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
1 ?1 q3 Z% S: F8 V2 N1 q( Y- E3 J2 W: W# P' s
; ^8 H8 _5 y' e9 H
第二步 转换
2 w, t; _$ T. Q3 `$ l5 z$ [( w+ F9 g: ~6 C T( }3 S
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
, p4 G$ G! Q5 [3 d1 e 下面的源程序,将BIG5码文件转换为GB码文件。9 |% L" s! j. L6 @- W! K/ J
: c' L& i/ F5 g8 Q5 Z+ d
//TURBO C 3.0
; X: u4 G. A U; d5 B# D ~#include <stdio.h>- G2 w& V9 B( d* O* w0 Z
#include <stdlib.h>
* v! p7 C3 M% ?, f3 h; Lvoid main(){
- l Z5 ?3 g3 {/ Y9 j- v1 u5 lint que, wei;
# R7 g& w/ ?6 B( ~5 n, `FILE * sourcefile;
9 i9 u5 D& C: R. u) u8 ~; Y) ]" {FILE * tabfile; \7 |, i3 q1 t# ^
FILE * destfile;
0 x0 N5 O: m5 `sourcefile = fopen("big.txt', "r b");
! C. n, x M- x8 k* @; a//BIG5 码文件
+ h! ]8 z7 b& Xtabfile = fopen("table.txt", 'r b");. f' [8 T3 w- b: J8 ?
//码表文件/ d/ y- [8 t, x' D0 f$ Y L; P8 f
destfile = fopen("gb.txt","w b");0 J& q2 l( U* {! t t3 ~0 M# B( S
//转换生成的GB码文件# I" N2 \9 H/ U- Z
while (!feof(sourcefile)){# F9 G/ I& J" H) R- H4 ]9 z
fread(& que,1,1,sourcefile);$ G6 D3 Z+ E7 O$ W% j
if (feof(sourcefile)){
3 D4 q9 Q$ t& M5 C% Hbreak; }
% x7 w) Y" N" _, v1 ~' b! i8 qif (que> =0xa1 && que <=0xfe)
) l: |, k, v8 z5 {' x0 I//叛断是否汉字(BIG5编码)0 l9 O% G4 U% W9 X. t$ C
{fread(& wei,1,1,sourcefile);
, W' F7 r, i6 r Pif (wei<0xa1) wei = wei - 0x40;
, w2 L& ~/ O/ bif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;5 S; R% g+ m8 H5 X9 v- e/ C, { U
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);# i, k4 K; b" L; d8 B; ~; h0 w
fread(& que,1,1,tabfile);
5 P7 D+ o4 C" Z! S0 x7 |1 }fread(& wei,1,1,tabfile);6 w7 ?+ Q! B3 J
fwrite(& que,1,1,destfile);
- c- s: [8 d% u) @/ R2 Y/ j$ lfwrite(& wei,1,1,destfile);+ [' h, i! {+ [( \, W9 `
}
2 R: P. ~4 f% nelse
y9 R/ d" \6 wfwrite(& que,1,1,destfile); //处理英文
+ m* G' l6 [+ K0 F}: H& _) F; t8 u! i
fclose(sourcefile);
' b6 K; A Y( B) A I+ M7 gfclose(tabfile);
, C$ F% l6 Q* {! a4 i9 Ffclose(destfile);
5 l& e/ v' K- x% ~7 Y: [( { _& Xreturn;
, G8 P2 C F' h9 N}3 ~$ k$ s: x* f/ y1 }7 k
8 i. B6 }; ^8 ]% I8 l7 |3 H 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 |