BIG5码到GB码转换技术
c/ P& T. u, n0 Y! W/ @2 ?5 f) h一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。4 x: P' j" B" ]2 t/ l, w& f: q
/ T2 ?2 V- v0 o8 C- n6 `4 Y 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
4 N, s5 q2 E3 F2 S% `7 {5 l; m% C1 F) ?+ C4 d. E( b3 ^- @) {
第一步 制作码表文件
! h, I7 i2 R1 O6 D+ v3 k
3 X5 f+ y2 ]$ N8 U( ~6 y BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。- _; U. V! a& a- V
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。: N9 D: t. J! l+ {9 o. v
9 R& e6 ?( A$ s 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
* G# m8 _; k U! x2 `/ h* E& D3 r
: v. a- k, k/ }0 H/ l" T& A//TURBO C 3.0# [) P/ P6 e% @: ^/ [
#include <Stdio.h>2 {0 U# L; b1 O3 v/ y+ |' g2 }7 t
#include <stdlib.h>, }' q3 |* r. h# ~" R
void main(){9 W* Y1 s: e. F
FILE * codefile;
. f8 x+ d% ~# I1 a7 T0 tint I,j,k;
5 t# l5 ^; E R' l5 k' J4 s; U* Y/ j5 {codefile=fopen("table.txt","w b");
$ p1 X2 ?" }! a2 S# W0 pfor (i=0xa1;i<=0xfe;I ){$ t( N$ K6 `! [; d! t
for(j=0x00;j<=0xff;j ){
; U0 v- ~& ]6 T" K! Ffwrite(& I,1,1,codefile);+ o2 r8 n2 a: N/ F9 \# P/ b' \# u( B0 I
fwrite(& j,1,1,codefile);}
/ U! v' I! B# O( I& ?6 F}
2 R5 [: q9 a( }% }# T6 nfclose(codefile);
/ ^+ C; P: H( C9 e4 i$ v' V `* ^return;
" ]0 {# j+ A r- z" [}3 U% [" G) q7 I5 l& M, \
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
# I( u9 G: T+ P& A L% I: u c0 c# E$ d: n% D( o
+ x! q* U+ U: a) t6 M第二步 转换
* ]: E! F) _1 M. e' W
0 x7 j/ }9 c0 [4 E/ i( [+ p// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
) \* N7 ~' `; _/ D/ ?( ?; R 下面的源程序,将BIG5码文件转换为GB码文件。 N* W! f6 T- k* N3 K) p8 ?' q
" ~+ c" O [. W0 I& r8 a
//TURBO C 3.0
" F/ \. f$ l9 G* w6 @#include <stdio.h>
6 n: S& r w; b3 g; z Q" b#include <stdlib.h>4 W8 ~! s2 {% x
void main(){5 P' _! r; c# B9 b* P7 S( m
int que, wei;
1 N1 |1 Z; D$ _( I( c) AFILE * sourcefile;" R6 Q& R0 ]% n1 N- j. y, j
FILE * tabfile;$ `( J9 d; |* m4 z+ u2 P
FILE * destfile;
4 N" w. a0 s, T K3 zsourcefile = fopen("big.txt', "r b");
/ \! [$ N, H: J9 t& e" T//BIG5 码文件
2 D. Z5 |% B4 l# q$ K9 S! a& Y8 jtabfile = fopen("table.txt", 'r b");
$ F' H$ y2 j2 ]: t8 G0 K//码表文件
/ w; D' r: x" j( d; q- ]& cdestfile = fopen("gb.txt","w b");
7 e; I7 b4 I# ^//转换生成的GB码文件
4 Z& k( r+ j; O1 S+ K9 b4 Y; owhile (!feof(sourcefile)){9 [, n! V# M; A- M9 w
fread(& que,1,1,sourcefile);% C" W) w Q# o" H4 S
if (feof(sourcefile)){8 L/ W# q: f* I6 c
break; }
! r3 j, E! Z/ b! u' G( z4 _0 {if (que> =0xa1 && que <=0xfe)
. a' D3 m9 j2 h- h# \ `- `//叛断是否汉字(BIG5编码)1 v: a( r6 I1 |! r6 }
{fread(& wei,1,1,sourcefile);- d& c1 r2 D' a A3 v% y- B* I" Y7 U
if (wei<0xa1) wei = wei - 0x40;
* m/ E' l6 T! Z% M* L, \% Vif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
: N) B9 u+ w2 o( ]fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);" P" _' S# Q, G" V/ B) `
fread(& que,1,1,tabfile);. i+ B8 W, T- [
fread(& wei,1,1,tabfile);6 F( p/ d, X% B4 u( c
fwrite(& que,1,1,destfile);$ I4 f& l b; o6 S0 d4 b& d
fwrite(& wei,1,1,destfile);
+ P9 r1 f1 n. j$ n6 T9 D}
1 s0 Y/ E# M, n7 `- l1 D) Z& N/ yelse/ P2 \4 Q; V: t4 k4 b( f7 [, z
fwrite(& que,1,1,destfile); //处理英文# Z8 b4 I( C0 }1 I- J/ d, d' v
}
1 P( Z# S7 J! [, Y& Q' I2 E, Ufclose(sourcefile);
( n2 Y* b; a% @: e, d% o$ p/ J. Lfclose(tabfile);
0 f9 W" s6 ]2 K0 cfclose(destfile);+ f1 ^# n, z2 I( m- l* w6 ^& g0 M
return;
2 d! R! U7 W5 k}
% U% M3 B6 J9 L, W4 [/ b% ]& U$ f& z, M' Y
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
9 g. {4 S" _' f& L" V# z M
" z* m1 U# `. A6 N) g- P 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。4 j1 k: ?( W) X. _+ l
- a7 V( _' S( T第一步 制作码表文件
) j: P4 H6 G6 s# `
- a+ I1 S9 B4 o5 O3 H; O" t BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
* x2 g" S3 F9 H制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。 Z3 u( P+ S% T" K5 P
l0 i+ m' l$ q' F 下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
. [! Q, E: O |% S' _
0 p5 Z( \4 H& z U//TURBO C 3.0
; p& _) {5 q2 C7 r ~9 u#include <Stdio.h>
! M7 j7 L4 v! A$ S! t#include <stdlib.h>
( g0 Q; N% E3 e; E: kvoid main(){
! N8 w1 f/ b% t4 e/ U- z; F8 rFILE * codefile;
# \( j, Y- a$ }! l! v& v" Iint I,j,k;
6 p( b+ y5 R4 f. ~# {# V' hcodefile=fopen("table.txt","w b");
, B' |. u! p) t6 M: u# h# cfor (i=0xa1;i<=0xfe;I ){
* e y% N# a0 O' W/ vfor(j=0x00;j<=0xff;j ){
3 E; E# s, c. F, V! f' u afwrite(& I,1,1,codefile);/ i) t8 D% ]) ~) ^8 ~$ w
fwrite(& j,1,1,codefile);}! V" `2 z1 I/ d m# X& L8 l1 m
}
2 K6 x; A) W' r6 F) Qfclose(codefile);- B5 @- I0 t& B
return;- ~* ^5 V$ h# \9 C- u: }
}
6 q- a0 i$ J* Z" o# i; n u& ^ 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。0 F3 V2 r) p+ j# m$ b
0 Z5 D2 s& {/ j9 ~/ L' H% y
' C# h! h; n; G1 F3 u8 T第二步 转换- e3 `) q0 v8 m4 t+ @6 u& a( X" C
5 I& V2 I6 J# g' G* j' h9 r5 }// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd6 Q4 m9 k0 g& D( o' O7 q0 {
下面的源程序,将BIG5码文件转换为GB码文件。
- _/ m0 K6 X' V4 R- o B' K# V1 y5 x3 x9 I- g& j/ F/ X* d6 [5 O
//TURBO C 3.0
* H) T4 J1 b) e) F0 b$ O#include <stdio.h>: v$ P% N \+ M, x2 P" W1 j3 C9 x
#include <stdlib.h>
( i- H! N( e$ ^. }1 y8 M% {! lvoid main(){
( W& g3 R0 {1 p6 Y. Nint que, wei;; [+ J8 l& E" }! ~4 K
FILE * sourcefile;
' l+ }/ z1 G. zFILE * tabfile;
: }& c; ?0 h/ H1 E8 H/ WFILE * destfile;" _; d! f5 e% ]8 W7 f j
sourcefile = fopen("big.txt', "r b");
! }$ y4 b- R) [/ Z! t& l/ j//BIG5 码文件* F3 S) l: q! H$ u' J1 A P
tabfile = fopen("table.txt", 'r b");" ]. E4 C* d/ x, U5 r: g$ J$ H- w' T+ d
//码表文件/ G! o! x; I+ l) I* r
destfile = fopen("gb.txt","w b");
! _6 z& b! m) f- D* [2 c- N//转换生成的GB码文件7 ]+ ]8 e# ^9 l: L% `, L
while (!feof(sourcefile)){
8 l; T# {* O- Q: Lfread(& que,1,1,sourcefile);
7 a. J0 i% l# c1 H3 jif (feof(sourcefile)){
7 K3 |7 P/ r! C0 Kbreak; }$ C4 r" N( D% i
if (que> =0xa1 && que <=0xfe)% `+ A- W( B6 N$ C$ `
//叛断是否汉字(BIG5编码)5 |4 Y! q+ i. B3 e5 U$ ]: j+ @
{fread(& wei,1,1,sourcefile);0 F3 @3 m. x# T8 M* C6 N: |6 e
if (wei<0xa1) wei = wei - 0x40;% \4 p! ]. l$ \- c2 \
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
; d. |1 |" H4 {2 Q9 P' Ffseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);5 c- k6 M6 S- Z1 w
fread(& que,1,1,tabfile);
+ _1 A; p# F7 A! P Dfread(& wei,1,1,tabfile);" x- D* R- f9 D2 [
fwrite(& que,1,1,destfile);8 y6 A0 N1 K0 F
fwrite(& wei,1,1,destfile);. ^# y0 H8 x& W
}
7 X! p7 i* z$ Q- @& K5 Oelse
2 D5 |4 i; f, K, W8 C, ~fwrite(& que,1,1,destfile); //处理英文
# Y4 Q+ G& s3 N% @8 K* p}
3 ^/ n+ X* E5 [2 e5 V$ o P" e3 o8 @fclose(sourcefile);" _+ P4 i0 Z& i
fclose(tabfile);9 |9 K3 P& n& F# c6 A$ L( ~# Z
fclose(destfile);
8 [! A2 f# `- j3 Ereturn;0 h. {4 h4 [4 T9 a3 i) M
}2 d* I+ x$ m* V6 F l0 {0 ^" d
. Z& _. V l/ b. p- z5 U$ b
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 |