BIG5码到GB码转换技术
6 {1 @! W3 G# S% e一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。( ~/ b5 s+ g( h8 U' h' o& }
- h7 P: X) p: n9 M i
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
* Z6 b y6 u, v/ f& v# M
- O7 L+ `8 m( t9 }; d7 m7 w第一步 制作码表文件2 f, O+ c x) v/ R% _5 X& Y3 I
, P" K1 T* V; W& c; |. p BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
@) R5 N: }: y1 N6 Z6 W制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。* A4 c0 W8 c# X8 |! q$ E+ s! a
6 k* Q- b( l7 g8 R# P% x
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。% e( Q: R" a% I) T4 G# x+ I/ K
0 w, N# r, p e8 W//TURBO C 3.0
, D- b* q; ?7 g& `# B: T3 w#include <Stdio.h>& @" b# T/ b6 ?- ^# {9 u
#include <stdlib.h>
$ C0 N; N% i1 W* d, `4 w* U- {$ Avoid main(){3 u: N& U8 u0 E/ ]( V7 ^7 v
FILE * codefile;" O! X4 ?, y3 C& L& H8 n* E
int I,j,k;/ j' }/ l7 z) [3 O" u
codefile=fopen("table.txt","w b");7 y) ^$ M/ `0 _
for (i=0xa1;i<=0xfe;I ){
; a' N" O; o0 J9 ?for(j=0x00;j<=0xff;j ){
5 u/ O; u' B. S% Ffwrite(& I,1,1,codefile);
* l; l! X$ D; ~$ I9 Bfwrite(& j,1,1,codefile);}1 K; F7 u3 u5 l
}) x3 I( P" |* T8 T3 ]
fclose(codefile);( T9 D$ o F/ @8 f- t4 c
return;
' j `$ Z8 G! Q/ O3 Z} o1 J4 r$ |. [0 s% c9 T# Z' h7 K
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。. W2 q8 f) [$ c2 t5 { s
1 O: V5 g5 g9 Y7 W+ ~. [' [8 T
5 V" I u! v1 |- C8 ? H
第二步 转换4 @" n' b2 x: K m' C5 ?# }
& d$ K) T" s8 \# c* W4 |
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
8 `/ y9 m. v0 G5 b 下面的源程序,将BIG5码文件转换为GB码文件。
; z7 p. {/ y- z
9 Y; ?) {$ r% R0 K//TURBO C 3.03 ]$ c" [4 |0 r% r8 M$ e
#include <stdio.h>
6 X+ j: J) I w5 O' `$ M' j) A#include <stdlib.h>& q; F+ A7 t3 K% M
void main(){. Z, q! ]7 |" C1 P3 {! h( I3 r
int que, wei;
" I. A; Y6 v$ O+ g( qFILE * sourcefile;$ S' D: w1 E5 O K0 {! s
FILE * tabfile;
/ B( W5 F6 X9 ]$ ?: WFILE * destfile;
: U3 F, N8 i7 f9 i) [6 D" K- lsourcefile = fopen("big.txt', "r b");6 Z- M6 I3 f3 V
//BIG5 码文件! l6 t; P* F! Z1 `
tabfile = fopen("table.txt", 'r b");
2 D& t- B* y H4 q4 [0 f+ O! r//码表文件$ M, ^. u+ q" `' A2 s
destfile = fopen("gb.txt","w b");
: u- Z/ P# Z1 ~5 _% t# N o//转换生成的GB码文件* ^+ Q7 i7 Q! A* P7 t% J! m4 H. F
while (!feof(sourcefile)){
7 Q; {; n- q, j @. ?fread(& que,1,1,sourcefile);1 Z3 `& u* c3 S
if (feof(sourcefile)){
$ e$ N, r5 G6 Wbreak; }
7 R. U, c7 {0 X, Nif (que> =0xa1 && que <=0xfe)3 s0 P9 j3 x* |7 H B4 U
//叛断是否汉字(BIG5编码); Q* k) N) U' Z1 I
{fread(& wei,1,1,sourcefile);
1 R+ V) }5 y( s1 f; O) Nif (wei<0xa1) wei = wei - 0x40;
- n5 p% Q- s( dif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
U7 h! R: A+ F4 b# U* V5 }fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);" A. ]0 j% _$ C3 \: q m: Y( V
fread(& que,1,1,tabfile);
# n1 x/ I* ~0 [6 ^) c( m2 Mfread(& wei,1,1,tabfile);
. l2 X+ W4 E: {1 `* mfwrite(& que,1,1,destfile);
# r* @& i& R8 P5 G5 [: vfwrite(& wei,1,1,destfile);
$ ~, C0 |- ~" m& q/ d! Q% M}
/ V4 @& T/ e, z g/ Selse3 B6 j% w, x7 z9 `9 X
fwrite(& que,1,1,destfile); //处理英文
\% v, A3 S7 ]}# Z* R6 C7 ^; L# J6 V$ k" k _1 V& |/ ~4 G
fclose(sourcefile);9 |& M A/ F% Q, L! j: c' G
fclose(tabfile);9 p, e; I, v2 h( [4 x1 J% n1 `
fclose(destfile);
2 w' i7 y: }$ u9 V" W* Nreturn;
5 Y+ _: L; I* S* W l}! ?1 u' h1 J6 E W) T
. s) G4 ]% B$ t ` 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
% S0 E9 w- J W9 _) Z
6 ?$ Q- L s1 ]2 ^ D5 y 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。; p8 c+ r3 q" \# h
; W% z6 ~7 ?! y3 t( ], n" j/ a第一步 制作码表文件
- S3 ]6 n. f/ k2 u% N
* \. u5 H. N1 m- e3 V. B BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。& Y" i! F" y# _; X6 |+ R1 i9 c
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
- b' k. p$ N5 H+ o) o/ `3 k" j4 O t* ~
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
6 q7 l* A4 W8 z! j% ^
( h3 B8 s. D+ {: u0 V2 ?# c( t- b# p//TURBO C 3.0
# c4 Q2 V' t/ g. `#include <Stdio.h>1 r. Q C5 F2 R1 E; _! |
#include <stdlib.h>$ i. n8 N4 J% x6 m5 [( V, z+ s
void main(){2 j0 N2 ^5 G) x" V2 p& R( ?
FILE * codefile;' l- H8 l* b. l. U, V9 z
int I,j,k;
- {5 j" i6 B9 T( X9 xcodefile=fopen("table.txt","w b");
# w6 A% W5 _0 D3 Tfor (i=0xa1;i<=0xfe;I ){
' T: E; X# V; C c C0 sfor(j=0x00;j<=0xff;j ){
) f: a- _: j, F7 V# sfwrite(& I,1,1,codefile);
8 i- l* A2 I1 S. w, sfwrite(& j,1,1,codefile);} C, z& K4 ?2 _0 N: A
}
8 U. |6 r j5 t2 L1 u6 {* T! jfclose(codefile);& k- H) Z W9 B! ^
return;
5 w2 ?: W, Z) }/ L8 x# M3 r1 M}
7 X7 b+ h; d; j2 [& c 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。+ z2 n3 [6 j9 U! w9 ^: a
/ g4 U5 Q* U+ s7 q1 ~
5 {/ W, g2 y1 s1 }第二步 转换
% u; H* o) M3 y- }; J
; o; @3 M; C3 \9 l3 ?- r// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
1 v) n2 X0 G6 k: Q6 i0 d7 \ 下面的源程序,将BIG5码文件转换为GB码文件。
9 D9 o P1 N% r9 m
) P+ N5 e5 O6 U# i1 ]- M3 \+ S//TURBO C 3.0' a l1 ]+ y+ V& n: P9 D
#include <stdio.h>& d% f9 G R! k
#include <stdlib.h>6 X; [/ n& {+ ]& G9 c4 ?
void main(){
# I/ J5 e8 [3 i+ kint que, wei;
* f6 X( S+ e1 H. ZFILE * sourcefile;0 D3 n, G. G8 W# d9 d
FILE * tabfile;7 o( a/ n' o' B6 n
FILE * destfile;
( F4 W& J# S5 H- u' ]8 N, }7 Psourcefile = fopen("big.txt', "r b");
9 C; a. O$ R2 N/ \- q//BIG5 码文件5 Z, w' V- {& x; t' Q9 Q/ O
tabfile = fopen("table.txt", 'r b");
3 b3 t* }- F; ?: K$ p: z//码表文件
3 K0 ]& i( D/ F% Ddestfile = fopen("gb.txt","w b");
6 b- s9 Y0 j5 Z$ o* U9 z//转换生成的GB码文件
/ E% @8 S8 N! F5 w- ?# Wwhile (!feof(sourcefile)){
2 p5 U, g3 s+ T- _ y- j; n: yfread(& que,1,1,sourcefile);
* r5 `+ g5 N( p9 I! Z9 kif (feof(sourcefile)){
0 F6 n/ H$ x# [1 Ubreak; }
7 I7 Z1 |9 k- M- o6 c0 Aif (que> =0xa1 && que <=0xfe)" q6 H/ V$ f% K. I { J
//叛断是否汉字(BIG5编码)
* E& \& I* Y+ z! q$ L{fread(& wei,1,1,sourcefile);
# K0 r7 ?/ E. w, |2 Iif (wei<0xa1) wei = wei - 0x40;, t5 ~' _7 L {, H& d: l
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;5 ^/ o$ h6 u6 p* M& H
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
/ s: \" c" W* Sfread(& que,1,1,tabfile);% l6 N2 ]9 {7 b4 y
fread(& wei,1,1,tabfile);
! P- k# _( j2 b" \1 N: M) Tfwrite(& que,1,1,destfile);
% S% c7 |8 V! K4 m5 bfwrite(& wei,1,1,destfile);& Q. ?9 P7 R& m9 f2 j6 L9 ~5 ]
}
5 d+ E) W7 S* q" L) q' Q2 I& Nelse0 i, M! Y2 |. \6 a, V
fwrite(& que,1,1,destfile); //处理英文
$ p7 {! F3 b, ?& G) u; E" e% ?}4 p2 b; S& E. b2 h: z V- R
fclose(sourcefile);# ]# l, m+ E, _1 X* w2 g
fclose(tabfile);) N: n7 w6 }+ `+ i0 I9 Z
fclose(destfile);3 ^7 C D; Z0 }5 N$ v
return;
# @3 X# Y% P. Y}
3 x5 _/ i9 ^, g1 k* G1 f
0 P* x0 U, g! N2 T6 K 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 |