BIG5码到GB码转换技术 3 ?- O; u, X$ J& |: g ~# z
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
' s9 ~+ k: s& P c, h7 t% w, O5 u) Z4 {! V2 y2 r+ c
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。& w5 N/ r& Y6 w
7 J5 [2 d! e3 j B6 }+ Y( n4 U
第一步 制作码表文件" w9 h1 U) @, v& u# p% s
/ B1 s: |$ N m3 t% q BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
; h. ~/ y9 t& }! a: Q制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。2 h. A) i# K/ ^" {( o) I
6 a9 H9 m& Z4 Z/ N A% t0 ]% @" W
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。$ U. ]8 \; w( ^& S
$ _$ d8 l' X$ Q4 d# {//TURBO C 3.00 ~2 F g% w$ u% V: W: s- x
#include <Stdio.h>2 w' Z+ s# M4 p. A- W# I
#include <stdlib.h>
6 z; E" d0 v9 u) z6 Q3 t- zvoid main(){8 j: N* X) b) ~( L% M
FILE * codefile;
& i) x# O, y; Uint I,j,k;
1 c7 u* S4 q) S( ^9 s# R, Scodefile=fopen("table.txt","w b");
& D9 ?* \) L0 Y7 H( [9 S! E! R0 @for (i=0xa1;i<=0xfe;I ){- l$ G L3 }1 H6 }! @8 q
for(j=0x00;j<=0xff;j ){
2 A6 {- a$ \. n& J( v' [fwrite(& I,1,1,codefile);
9 ]" H+ B+ C+ k' S+ K$ z9 K: @fwrite(& j,1,1,codefile);}
" I6 V% Q9 X+ z$ l}0 |8 d3 N% M8 n# f9 v1 p8 e% M
fclose(codefile);( ?9 p# }3 W: t& f0 k
return;% i2 W. c* u1 S% a" S* ?+ h5 r
}
3 p$ b+ _: I5 Q7 \. b 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
% y5 G0 n& s5 \6 z9 b. r( V4 i7 B" i4 K' Q# D
% Z9 s% p: ^+ M( ?, v第二步 转换
1 q, ^0 j; g$ l$ ?6 B- U2 Y. r8 a+ C- B5 y9 |5 p: P: L+ b
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd6 P0 k; n- T$ a9 }! G
下面的源程序,将BIG5码文件转换为GB码文件。! c' `# y* w* e' P
; F1 }5 q" W4 Q1 i
//TURBO C 3.0
9 t6 p! D+ t3 @: G& L#include <stdio.h> w9 D0 Z; Z+ A, I
#include <stdlib.h>. n* `& K5 T! O4 y8 ~) C
void main(){. P( q8 f8 t$ \2 ]
int que, wei;9 h( S; x4 M8 T/ ?# l
FILE * sourcefile;
/ ]; w* N4 ?4 S: @% h3 LFILE * tabfile;
( J9 U! p4 T9 Y& v# D3 n9 {! Z8 ?FILE * destfile;4 k5 i, P0 ~: z2 _5 A4 ^4 a; L/ X
sourcefile = fopen("big.txt', "r b");
3 |2 z9 h* T0 A5 ?2 e3 h' O( i+ ?//BIG5 码文件
( Y# T1 R; O7 z6 L' ?3 Wtabfile = fopen("table.txt", 'r b");
5 Z+ C) E3 {% ^( v X- F//码表文件) {+ O: W0 M" q9 ]9 o: k. Z
destfile = fopen("gb.txt","w b");+ L- F' z( r5 D V3 s9 R4 q
//转换生成的GB码文件
1 ?! W! `* x+ Y8 \$ Dwhile (!feof(sourcefile)){
( @8 d5 h' D0 @- g* bfread(& que,1,1,sourcefile);
' _. {: x" {. ]* `, i$ d- G" _$ lif (feof(sourcefile)){
+ x) Q, |: l, a; _9 |break; }5 y8 U0 [7 u8 l
if (que> =0xa1 && que <=0xfe): U5 U w6 b! n5 r( P+ n% O. ^" p
//叛断是否汉字(BIG5编码)
2 |& j) \/ t1 C* {{fread(& wei,1,1,sourcefile);5 n9 S. \7 t' S: c, @0 p1 \7 A
if (wei<0xa1) wei = wei - 0x40;; j0 @8 K _1 C. o: h
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
. F! k7 b; O: D1 x Y- zfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
V" [* s8 H# Zfread(& que,1,1,tabfile);
6 w. S4 k; z* W* ~$ g3 ?; Pfread(& wei,1,1,tabfile);6 S, h5 e5 w4 v; I3 s
fwrite(& que,1,1,destfile);
" p' T: a4 f e& k+ v% v- H9 a; }fwrite(& wei,1,1,destfile);1 {9 v: |1 F9 G$ J
}" }8 f m5 }8 P# a
else
( O; m. Y/ }$ n/ x/ m& ]fwrite(& que,1,1,destfile); //处理英文3 h" G7 Y8 e( g/ ]
}2 u6 K) Y* o% p! e- ^! Y5 g
fclose(sourcefile);5 `7 Y: u5 s5 K4 t* n( c% i
fclose(tabfile);, ?3 U6 L" |% t* v- L* t2 ~
fclose(destfile);
1 r, f& s& v6 m: D: sreturn;1 ]' q4 p! y% \% ]5 C0 ~) v
}2 j8 Y: Z6 y7 b# G( O) N( Y
6 K8 b$ g1 O. u7 n* @ 以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。: u1 I/ p) \$ Y b' O0 ?
! d5 U! J; {. ] 汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
7 o4 P8 V( y- l: Z1 ~) U; g4 i5 e- g$ ?2 |
第一步 制作码表文件5 ^) H* g% l# p( s6 v
$ V. z# K9 c }/ U3 d. b
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。! j( b0 u' P- g. ]- V& t
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。, k2 d/ y- X' Q! F$ Q7 I
& R( |. ?) q+ a8 |" o
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
- C6 A6 s8 u3 |+ g# V$ z+ v9 Z e* \- ^7 U" ]9 h
//TURBO C 3.0
. m1 H. c6 Q7 ?# P#include <Stdio.h>
7 \5 e# o- ?( }0 N6 E( S! y( j#include <stdlib.h>
9 G9 t/ K( Y* w- @' Yvoid main(){
9 \. q2 k) d) JFILE * codefile;
, r6 x; g& a5 X; {4 x7 Wint I,j,k;& |% n0 J1 S! V3 n- L$ Y2 [
codefile=fopen("table.txt","w b");
' ]- G0 p6 D! |8 T5 |% ?for (i=0xa1;i<=0xfe;I ){
5 R5 L. b9 f' O; T+ y. sfor(j=0x00;j<=0xff;j ){3 q$ y6 O$ K% z% S8 `: S/ z7 S0 N
fwrite(& I,1,1,codefile);0 k9 _, X4 ?: {- Y; l
fwrite(& j,1,1,codefile);}3 a' W" t* U5 {5 ` s. ^0 l, }1 @
}9 `" A2 q6 C2 ]
fclose(codefile);: h* B* r; _' F" v8 G1 e
return;
) ^* p8 _ @5 s}
" P, F$ p, a& K' S% ~ 运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
- E5 S) @% @1 \$ I' R- b3 Z- M' I' [, c. y) `
8 H$ v( D$ I* R第二步 转换
! p0 w$ P' g$ B9 k8 q
8 M" X: d2 L5 k' P3 R// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd5 v0 f2 q1 a- p! A! E9 u
下面的源程序,将BIG5码文件转换为GB码文件。* [! B, `: l$ w, t! M3 b) b" X
8 L1 g* A- P! ]9 t5 I' d//TURBO C 3.0
F. g# x% x) D' e) M4 r#include <stdio.h>! w% R9 _$ [" [. c0 d3 w- ]2 {6 \
#include <stdlib.h>
3 J7 P. z5 N' w3 Wvoid main(){
) ]/ [; k+ K0 `int que, wei;0 i& u; y5 e8 q/ q( v! Q
FILE * sourcefile;
# {* W' s3 F$ h) L' s- J/ s1 ZFILE * tabfile;0 z6 H& r0 ~4 W* [- ^0 y1 `
FILE * destfile;/ t* x' u* `' p$ B1 b
sourcefile = fopen("big.txt', "r b");) F5 c8 [$ g- y- \
//BIG5 码文件8 [5 z) ~7 R; a8 q- A% K4 ?: L
tabfile = fopen("table.txt", 'r b");( s# d) l& u7 \% Q" j( N
//码表文件
, h" x* z) b( ]: Ndestfile = fopen("gb.txt","w b");9 w; x1 a3 I- N4 Y! v7 M& C" M
//转换生成的GB码文件
2 f# S7 l/ J- B& @. ]while (!feof(sourcefile)){
3 }4 Y& O% M% {8 M6 Q. g1 Cfread(& que,1,1,sourcefile);) I( z1 ^" `' K. d: [: x
if (feof(sourcefile)){
) c- m9 F: ]7 sbreak; }' W" f/ M, }" u G
if (que> =0xa1 && que <=0xfe)
' W0 Q8 r" `$ I# r: B2 M$ B* j3 z/ Z//叛断是否汉字(BIG5编码)
3 p, ?& x$ R7 ] n{fread(& wei,1,1,sourcefile);: H) A4 d0 ^+ |. L) a6 T
if (wei<0xa1) wei = wei - 0x40;
5 G- n! L: r5 d: m& h# Q6 @0 _2 _( oif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
9 D1 p9 q' i# t: nfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);5 U+ x: Y' [) ~# W2 m
fread(& que,1,1,tabfile);
/ c8 {( J- @$ S$ z' V3 f3 ?fread(& wei,1,1,tabfile);3 L/ ?* d& S$ X# c, I- o
fwrite(& que,1,1,destfile);
; S$ }; ^' @, R2 r4 [fwrite(& wei,1,1,destfile);: B2 {0 H3 g, f" e# H2 ^6 p3 N
}0 ~4 B9 D6 R' B0 q& e0 E/ V' }7 o
else$ X) r9 Y1 ~$ ]& _& q
fwrite(& que,1,1,destfile); //处理英文
2 Q! A8 [" L" O3 j}+ Z3 q! _8 ?: P+ r* T
fclose(sourcefile);
8 h2 L* v# n7 ~fclose(tabfile);
( H7 E0 Q- a* v! Mfclose(destfile);% X, r+ i7 I6 `$ h! a, M
return;
. F+ r5 ]6 [+ P7 F4 Q}! G4 C( u% |! W
3 n$ j1 X! s+ Z# U$ @( C
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 |