BIG5码到GB码转换技术 " P7 n, W% s8 ~: a$ M3 ?# B
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。" ~1 K" ?6 a3 q( v4 n. X
5 ^# n4 c: \: C 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
# S$ v, i- c: ]* V7 }
( {$ c4 X+ r- ~+ O0 B% @& l第一步 制作码表文件6 H! a$ E7 `1 g+ x5 N! c
' q/ b$ V1 d6 h BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。9 h/ O& a, ]: T/ P2 t' r7 N
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。2 X. g7 t7 X. S# z1 j" J5 G
" v; L! P$ G! G" }
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。& D# o& m/ d: L5 f" M, V# l2 |
1 V: K# ]" r# ?! Y( V, O" d. o" V' h
//TURBO C 3.0
+ }; n( f" Y. I- R#include <Stdio.h>9 P4 A# T# P9 w" z, r2 g' J( T, `
#include <stdlib.h>, R/ O5 T& |, o7 w& B$ I3 K
void main(){
" Y# u$ _/ J: |4 B: Z6 c- R. |; {FILE * codefile;
; a9 T5 N. C$ N- e3 A+ Tint I,j,k;8 V& E# E ^6 d' x6 t% |9 _
codefile=fopen("table.txt","w b");
# W7 n$ r% H4 l3 w! ifor (i=0xa1;i<=0xfe;I ){8 p$ | h& _; S1 w5 b/ m
for(j=0x00;j<=0xff;j ){
0 X2 r% N. w( w: ?fwrite(& I,1,1,codefile);
) b4 a' Z$ M' Xfwrite(& j,1,1,codefile);}
( A; K: A" |9 A5 L0 x6 f! I}
! Z$ I7 p) |3 M( b0 i( D# _fclose(codefile);
- A9 N% g0 U* J6 i( _& Areturn;5 n9 l: ^( R; \. y& B
}
% L# b6 b; T f5 ^& h$ w 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
8 ^' p, a$ ^5 W( W4 m
: I% J& K; j! }1 `: a/ W* X) D+ f" J8 o8 f& J/ \+ ~
第二步 转换
9 T# e n' c8 O% _- R
& b; `( f+ f' A2 E g// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
$ v, V& r; H' \8 P 下面的源程序,将BIG5码文件转换为GB码文件。
' C8 @* x5 Y; I4 Y) ] x* ~! K+ A1 N* Y, z3 A/ y* e" s) m* s8 i
//TURBO C 3.0
( V* L) g' b: V: K$ _% @#include <stdio.h>0 \) d* K8 }# q6 v. Q3 v; j
#include <stdlib.h>
+ z7 R! ], Y- ~$ l& j" v6 ~void main(){
/ G5 e& R4 c; W6 t" \! eint que, wei;
' v1 L: p. X$ w$ k; X* A* JFILE * sourcefile;
( c* z' X2 @2 A, e. q! K7 QFILE * tabfile;* S/ {& b# i" r
FILE * destfile;0 a9 Y" _+ j" w
sourcefile = fopen("big.txt', "r b");
U. `, p+ G, }9 m5 F5 R- ]) w//BIG5 码文件
& N2 U5 j$ O1 [+ w5 atabfile = fopen("table.txt", 'r b");
2 O: N! g* Z, M- Q; d/ g& D//码表文件; T9 C: F: O8 }& e2 M
destfile = fopen("gb.txt","w b");, _0 a) t/ I0 P2 N
//转换生成的GB码文件
" H9 l- D2 X Y& ~while (!feof(sourcefile)){$ v* X+ r+ l. N, {
fread(& que,1,1,sourcefile);/ L# H. X1 }$ O P2 R3 H( x
if (feof(sourcefile)){. q9 v0 ]) `$ Y& n# R! ~2 c
break; }* ~ b% G- @8 F1 z1 |8 x
if (que> =0xa1 && que <=0xfe)
4 D8 \6 z. ?2 W- r! C) H: c3 y//叛断是否汉字(BIG5编码)
1 Q. E) p$ n' B8 U{fread(& wei,1,1,sourcefile);
2 u5 K. y6 K* R) b1 k) A) ^if (wei<0xa1) wei = wei - 0x40; ]6 I+ D) ?) k
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;& d) m7 S0 X! ?" u$ @4 O! T9 F
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);, F, f3 a: E0 z B" E0 Q
fread(& que,1,1,tabfile);& o% |9 q4 S- S( ]
fread(& wei,1,1,tabfile);# G; \: `* {7 R0 s7 s5 J- J
fwrite(& que,1,1,destfile);
/ P1 W$ r3 N$ h" h& w) i$ |fwrite(& wei,1,1,destfile);
) d: P0 {! n8 t g& D}
0 h$ w: ?/ Y# d/ c+ lelse6 S6 B5 J* `1 p
fwrite(& que,1,1,destfile); //处理英文
5 P3 S Q5 W4 v. d; A$ T4 L' S}
- ^; X( o8 g- i: Ffclose(sourcefile);/ ^. A; K% O- K8 I7 n3 \7 L6 A8 o
fclose(tabfile);9 P, v- ]& S7 L! w7 z) u! q
fclose(destfile);
2 ]! y' Z% o+ T+ D! v* areturn;
) o- S/ X: W. C6 }}4 B5 q. d2 z8 b: m7 ^
/ [4 L9 A: w, Y& c 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。0 O c! w9 q0 }7 I6 M
) g. D8 M$ Q: _ E
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
3 s* w0 z" g8 C- P3 x9 d4 c8 ]. Q
1 r1 |9 h# F C' B7 P7 j! [; `第一步 制作码表文件
/ T0 t" D) m& ` r' H9 X1 j+ h8 W- V( z0 y6 O) M
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。- D' {9 M( Z- p4 p
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。6 T0 \2 O w5 l3 D0 @8 u$ ?* o
, D! f; O6 v7 B6 h; R0 l. O 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
. L5 Y: E9 b1 _9 i
; w5 k$ J) Q4 v$ V5 a( N//TURBO C 3.08 F% X# V: B3 y
#include <Stdio.h>
" {+ m4 o2 j$ Y) j( h#include <stdlib.h>
4 f8 a0 t# ~( Q: B4 |6 gvoid main(){
$ L7 j& B. I& S6 G6 eFILE * codefile;* t5 V! m q$ `& h: C4 [ R; Z- ^* _
int I,j,k;% ?1 O7 X8 g2 @& ]; [& L
codefile=fopen("table.txt","w b");5 c3 U) V7 z# n7 Y3 m# l
for (i=0xa1;i<=0xfe;I ){; N8 t; X% X5 r
for(j=0x00;j<=0xff;j ){
4 L, r! k8 J2 T3 c/ o2 d# Wfwrite(& I,1,1,codefile);7 u+ {$ l( b3 p& m8 }* l( O
fwrite(& j,1,1,codefile);}
9 L! Q: p3 f9 Q1 R" c}) [4 j h+ x; @( ^' \3 K1 E
fclose(codefile);. Y, Y* ]9 h% u& P
return;
7 [' o- q6 ^$ z: W2 ^% a4 T9 `}
" w! b: u4 Y9 M' A9 f 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。$ E5 C7 [6 \4 X! A: @* ^& K# O
7 S: F g, a0 I; S* K! x2 I. B# \4 r7 _7 x7 i4 ^8 }$ Y
第二步 转换; k; L2 R r: u% ~ i/ a) B" n5 c
$ T- j7 M I" \/ u9 }. v
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
5 |5 t% Y# Q! E- w0 j 下面的源程序,将BIG5码文件转换为GB码文件。% I5 Q( R1 E9 _8 b+ Z, I/ }1 \, j
; f7 p0 n- D! V; ]7 S! p
//TURBO C 3.0
; \; e$ ~( ^) g#include <stdio.h>
2 c! }* n2 \7 x#include <stdlib.h>3 v/ m2 H4 n9 t: u% M) D* L$ s* ~
void main(){
# b4 r$ J& U! a4 n" Kint que, wei;1 T9 T9 \# R1 _; S1 k2 }
FILE * sourcefile;
$ A+ l' A. x6 WFILE * tabfile;2 V% ~6 N$ p3 f- U. z
FILE * destfile;
3 ?' {3 b4 k( X4 R1 [6 Ysourcefile = fopen("big.txt', "r b");2 {3 W5 K0 x5 T' J
//BIG5 码文件. D3 @6 v( n& L+ z; d
tabfile = fopen("table.txt", 'r b");
" s8 E3 Z8 @& X/ z0 D& T& k//码表文件& Y1 `6 C! H. t' n9 H
destfile = fopen("gb.txt","w b");
) s: e" O0 e* Q5 {//转换生成的GB码文件0 V2 Y2 W9 c( [1 [3 y8 a& \
while (!feof(sourcefile)){
' i$ W6 H/ Z c( {fread(& que,1,1,sourcefile);/ ~# ]" {7 D- g0 e! H7 @* ^
if (feof(sourcefile)){
" f& j( N0 g6 A! @$ h3 _break; }
4 D) n+ X* t$ ^" Z/ W3 E2 wif (que> =0xa1 && que <=0xfe) V& `6 @5 A' H/ v5 b0 @! X" P
//叛断是否汉字(BIG5编码)
1 e) j1 ]% R; B9 u/ m{fread(& wei,1,1,sourcefile);
; X9 `5 h! |* ]1 n- jif (wei<0xa1) wei = wei - 0x40;+ Q" [( U \2 g y" W5 f
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
7 Z: p* k$ o4 M$ L, P1 Y! z' o) kfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);, w8 Z$ T: @: X5 P, U6 \# \
fread(& que,1,1,tabfile);
& \' Y" W: l9 [1 d) U5 G. i4 l6 I9 Afread(& wei,1,1,tabfile);
: j' [# S2 [8 K# W% A2 q' bfwrite(& que,1,1,destfile);
) {0 d& H# H) A) t/ u9 s8 K$ Yfwrite(& wei,1,1,destfile);! r5 F K: [' T0 ?9 x* R; f
}
& g. C4 c2 i! v) f# m4 eelse: e$ }7 e6 L' P5 O4 p
fwrite(& que,1,1,destfile); //处理英文% |8 ^9 e8 c# W4 F! x3 W2 D2 c% j
}/ Y/ F0 D9 V o) v3 V2 Y
fclose(sourcefile);
+ f {) t1 [1 M0 m; y8 hfclose(tabfile);
3 b7 D" T4 D' C1 ` i2 pfclose(destfile);
; B5 J- m2 g, H& l: I% Q3 ?return;: y1 A9 I4 `: \6 m! b: f Q0 u! j
}
: S" _9 N8 A% _: e5 X) o% d4 w) I: R# S% J5 {- j" R
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 |