BIG5码到GB码转换技术 / ]& A \2 ?9 w$ Y% S6 i: X" C7 E) [
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。9 H! P9 j# ^" k M$ w7 P
* A% L& q3 q" W6 s( D$ V# _; Q7 g 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
* I+ c% Q# H9 V* Z w7 R. k4 F. t9 z' Y! N& _
第一步 制作码表文件
" \2 o2 V6 V2 j R$ p% r; S5 ~7 \" b y# Z& b3 u% }
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。5 r& M1 A7 v: J
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
5 l- }3 ^9 D" d5 k0 H
; e% X& t* A. L. j) l9 r 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
6 m8 E, l/ k! d6 c$ h/ n7 H# e2 I3 M. j$ n( L- E u
//TURBO C 3.0
4 i b9 K4 F; P& |# R% V#include <Stdio.h>: P, N. n3 A9 b7 y6 S. }7 w; z
#include <stdlib.h>% y, R5 q. S6 i' H6 ]! ~5 m
void main(){! q$ V. T; C, k8 o% L
FILE * codefile;
! ~+ h/ o9 o' ?. t' T: rint I,j,k;
0 g0 }5 K8 C1 }# c! W1 D/ |codefile=fopen("table.txt","w b");/ y+ p+ j8 @. L& y, c
for (i=0xa1;i<=0xfe;I ){
' w# ?! x1 b! \' Q' R }! A# v1 Ufor(j=0x00;j<=0xff;j ){* A- K* I X. H9 { J- G
fwrite(& I,1,1,codefile);/ [* E+ P$ p4 Y, z
fwrite(& j,1,1,codefile);}' V! S, M7 T, P3 ^" G! \
}' x6 }8 Q: j" z M" M% C9 T
fclose(codefile);, n% T3 f- ~2 d5 _+ _" B
return;, k C$ i4 o( r) n: m8 B6 C
}: s2 n2 l) g! b; t
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。+ C. W4 l" m% \- T; [0 e
4 y3 u! {3 Q& T6 l8 F4 j _) T
6 B4 p6 V- n) |+ f' L3 A第二步 转换
# n$ k5 |) n* U! j, ?) c( V: x) p. Q
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
]9 B) a+ n6 [! E5 S# G 下面的源程序,将BIG5码文件转换为GB码文件。( H! O4 Z+ W: h
' x. {8 s( W) C9 D o//TURBO C 3.0
- m# A& |6 K ]. x#include <stdio.h>8 C# u7 K0 E2 R& R& I! s. J* a
#include <stdlib.h>
4 B2 i/ ?6 |! ~: m: {void main(){
) f4 A& F+ z0 V' i2 |( T# ? sint que, wei;
% Z* S# a5 K( FFILE * sourcefile;* n3 a _5 }2 b5 ~
FILE * tabfile;6 s: c* ~. m8 ]0 O: @( B
FILE * destfile;4 S; a) y/ O- @+ P
sourcefile = fopen("big.txt', "r b");5 m& F5 Q- ?- M, Q- j
//BIG5 码文件
+ }9 `" w3 @& e" E* M& m! Ntabfile = fopen("table.txt", 'r b");
9 s5 |3 V' c7 ~9 G, s7 M* P//码表文件
6 Q1 M9 W$ z+ Ndestfile = fopen("gb.txt","w b");
2 u- B' @" S! u3 D2 G0 h+ ~' j//转换生成的GB码文件
/ Z( c# B8 u. M7 z* m4 Fwhile (!feof(sourcefile)){
O& R* o4 |1 P" V' F6 jfread(& que,1,1,sourcefile);0 j) [( M/ | `9 l! I
if (feof(sourcefile)){
- Q% E4 x/ J T6 {0 mbreak; }
- A+ N# l2 t0 f; X6 u- |if (que> =0xa1 && que <=0xfe)
6 [1 a( S% U, M5 w//叛断是否汉字(BIG5编码)
0 f8 U1 }8 O" F{fread(& wei,1,1,sourcefile);* s2 N* f/ m g- u
if (wei<0xa1) wei = wei - 0x40;
/ V1 g, d1 f2 y5 ]$ Rif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;; _8 \& q3 F5 P+ z D
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
, {2 W. {# B) t$ r/ H( X" k6 a2 d: Sfread(& que,1,1,tabfile);6 B. {' f4 X: u1 R
fread(& wei,1,1,tabfile);
) [4 x% Y8 L9 W7 r8 Zfwrite(& que,1,1,destfile);3 B$ c1 z; N- a6 C
fwrite(& wei,1,1,destfile);; }$ p$ F; ?; l/ p- f
}
0 C. |& `2 N& Telse1 m* ]. I* h+ j" Z0 p( T4 Y) \* L8 y
fwrite(& que,1,1,destfile); //处理英文
+ e. p0 A7 ^7 [% {& t$ P) O: t; P4 G}
# Z" U* ^2 P) Y+ W- Ofclose(sourcefile);
/ b+ |& ~" r& [4 \fclose(tabfile);
5 T2 r; Q( w9 t; ?, ~fclose(destfile);% K1 p' A6 t1 [! j" d \
return;1 W D/ o& s& N& v1 T
}
% C" }6 p3 [8 D, }. ~
" U7 V; H. b& `, K 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
5 b1 p7 T5 ]+ _* i2 _/ p0 c; ]
- X% x: t5 C6 w! h! f 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。. ?8 Y: G$ z7 k" E( a1 d
! b/ \, e6 M$ Y$ C/ Q
第一步 制作码表文件
! r- J B; @! t) a% i* G; A% @$ Z$ m7 U
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。/ I4 K* K% {* X( z2 k9 b, K
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。+ W8 J+ q: X( i6 y- \
' m% K& S4 M8 M* D! U 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
# u: c2 R# z: [' K7 {; ^7 c" `. D- w# S3 Y! ?/ Y- ~% A7 Z
//TURBO C 3.0
9 m5 k5 T( `) [- ^' s2 l8 z0 v#include <Stdio.h>! n) |8 e* U+ v0 o% W: G/ m
#include <stdlib.h>9 s* @8 H/ O% N3 r$ y g7 v
void main(){8 R1 T& S) [7 V; E, a# W3 b
FILE * codefile;5 E- y' G0 v$ I2 y
int I,j,k;
R* k, b/ d5 [* y" xcodefile=fopen("table.txt","w b");! Q; ~ `7 q4 b4 Y& y
for (i=0xa1;i<=0xfe;I ){" ]* L. W% X, i X( K
for(j=0x00;j<=0xff;j ){$ k1 _5 t1 _! q& x
fwrite(& I,1,1,codefile);' |) l9 h5 l" k/ w% t
fwrite(& j,1,1,codefile);}% ]' w- f5 b. l. \
}( _: o9 S( [0 A x \2 m" A5 E1 Y1 A
fclose(codefile);
/ j' {+ n. i, r' y: S$ H' mreturn;1 }8 b" c# v$ q- N( E+ O I
}8 l* y' b7 E+ q3 w* l$ e1 {
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
4 m. z9 {' c: I |5 V
( Q3 g/ w# ~& E: }% g7 R* h
* O0 m" W; r! I: ` m. X0 x- P8 v8 c第二步 转换
2 D' N; ]" H- k! Y' u1 t1 F9 @% j- F+ M1 R$ L- o
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
5 n1 _5 a1 ~4 P! K( H' R/ t 下面的源程序,将BIG5码文件转换为GB码文件。
/ B @- K# ~. z0 a& f- q
, G& ?" P9 H. i! h6 d0 F; r//TURBO C 3.0
* Y8 Y6 o, _5 V$ |0 O K- ~#include <stdio.h>6 u0 T$ {2 g+ Z5 L- c# d7 J
#include <stdlib.h>
( A/ P, x/ o0 cvoid main(){4 q" m3 ^3 Q9 ?7 A1 u
int que, wei;
: h0 P, v# x$ P* q: x' oFILE * sourcefile;
' x) y% [! Z& I4 D; N8 MFILE * tabfile;
! Z2 c( p+ a" C/ e' _. U/ j& z8 rFILE * destfile;) \0 m# z9 Q4 s( ^
sourcefile = fopen("big.txt', "r b");
8 V% f- F7 g" ~. y//BIG5 码文件
5 m$ d! j* a1 k: U4 _tabfile = fopen("table.txt", 'r b");" T4 o S7 K2 f! Q/ q
//码表文件7 W: v- m2 ]% _* q3 u, l2 g5 W4 C
destfile = fopen("gb.txt","w b");4 B; ]' Q# e3 w& S
//转换生成的GB码文件
& m' c, O- I q& _8 K9 ?while (!feof(sourcefile)){
! y; @. y# F4 y9 e/ n$ Ofread(& que,1,1,sourcefile);) u+ ?4 z% M9 e- K. |7 n/ J$ M
if (feof(sourcefile)){
|, _0 @/ I) K- Ebreak; }
- H' ?; Q' \! i d& F0 q9 C- O* Xif (que> =0xa1 && que <=0xfe)
9 d# H4 \5 H3 g//叛断是否汉字(BIG5编码)
7 M" i+ a+ P- B2 {1 P{fread(& wei,1,1,sourcefile);- x- Y" a% r& j- K
if (wei<0xa1) wei = wei - 0x40;
6 z1 T8 T" b& a, h9 v/ ^if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
+ ~6 n7 ]) q7 c* u' T) ~fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);+ }4 \4 u0 B% l+ E1 d- r
fread(& que,1,1,tabfile);
; S$ o* ]: _$ }5 hfread(& wei,1,1,tabfile);
- a$ i5 L( l: X: ^8 d8 Tfwrite(& que,1,1,destfile);
1 o' `2 y* u$ Ffwrite(& wei,1,1,destfile);
) [$ A8 K/ Z" V8 U, M+ p# G9 W}* a2 G* p: y: c0 {
else
@; c: T2 _5 e1 B5 p) Yfwrite(& que,1,1,destfile); //处理英文. |7 |6 \0 `4 n5 z$ b" _
}+ ]( m6 h. \+ |2 l; e6 A' d/ V
fclose(sourcefile);7 ], D; s( ^/ O; N8 I
fclose(tabfile);5 j+ ]6 L' b, M C: T' T6 K z( v
fclose(destfile);* k2 p D8 Q; o: y' T( ^
return;: }2 k) b1 q# O- T1 K
}
6 K; V: z% T: M* W( S1 p# @4 ?2 i% L" Z2 \
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 |