冒险解谜游戏中文网 ChinaAVG

标题: 【scummvm汉化】BIG5码到GB码转换技术 [打印本页]

作者: shane007    时间: 2009-5-17 22:48
标题: 【scummvm汉化】BIG5码到GB码转换技术
BIG5码到GB码转换技术  
% w+ _  t; y2 f一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。3 c. X# ?4 ~5 A" Q( P
9 [8 Z# B5 w& c1 D1 `( C- Y
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
6 h* a2 \) A7 m. L8 {4 }
* y# }1 }  ?, k; T第一步 制作码表文件2 b; J" X2 c; I& g# K' y2 y# c
, r0 R# c& h; v! h: |9 f
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
7 F% [0 z  d0 h7 K制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
. W7 e8 G0 p# J2 P5 l: ~' P$ m$ F+ c8 G- @; c
   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。& `4 P* v6 \8 M3 U4 Z' R1 Q

' a" i" |: Y9 f//TURBO C 3.0+ l8 l& N9 w, G6 Y
#include <Stdio.h>+ {7 E: y  z) {9 m/ n
#include <stdlib.h>
, B7 n+ P$ x. jvoid main(){
% @. l& _& P  @3 P, hFILE * codefile;* t; Q, }# {& J
int I,j,k;
9 E7 I4 v+ Z% i$ ?- v( \codefile=fopen("table.txt","w b");& g8 n9 C8 C  a1 _! {
for (i=0xa1;i<=0xfe;I ){+ z/ N: q: s+ h) P$ Q
for(j=0x00;j<=0xff;j ){, v+ b7 j. ?7 `/ L/ G
fwrite(& I,1,1,codefile);/ m& |3 _! a/ z, _3 X
fwrite(& j,1,1,codefile);}
! u2 A4 L7 u5 l  l4 n0 i) h}+ C. Z4 X7 R3 E2 o  F. t" N
fclose(codefile);
- g0 ~/ S! w% Vreturn;* k# `: @. ]2 ~2 X; b! U
}
, i- Z5 l' ^3 I' ^; h, L& G  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
8 D$ t1 h. V- I  \+ E( G$ j2 y% V/ a. y
; j. C+ K2 ^0 t: n0 j* m& a8 i8 X+ T$ r$ v% L2 _* l
第二步 转换
# d# a  F% Q. _2 _* F  x- N8 I! t) a- y0 Q5 ?  O, _/ Z
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd+ H, i- N1 Y: j- p, m' j( _
  下面的源程序,将BIG5码文件转换为GB码文件。# n. i% T: ?/ W  ~/ o
4 V6 L& R% R& e- A
//TURBO C 3.0
" u7 r% Q- w8 g#include <stdio.h>
8 b4 \' ^5 M7 h" v#include <stdlib.h>
( c  H5 X( X9 M: P$ O# ^void main(){$ e& Z6 X( E+ c, M
int que, wei;( F, ]0 u+ y8 L$ D3 ]
FILE * sourcefile;+ M$ R7 q* Y. S3 u
FILE * tabfile;
. h* a- g+ E1 R9 u9 iFILE * destfile;- A9 J/ o+ C6 W0 N8 U/ ^1 k3 b
sourcefile = fopen("big.txt', "r b");
( r' o7 X5 M# o- q1 v/ u& d//BIG5 码文件
2 L, ?9 y1 q! h8 V- h/ B/ ntabfile = fopen("table.txt", 'r b");
4 O$ m' i: \+ B6 m( E//码表文件  E6 _' L( U- G9 f) L& B
destfile = fopen("gb.txt","w b");
' X4 j5 Y- o$ P//转换生成的GB码文件
( b0 {! D. S9 L  k7 rwhile (!feof(sourcefile)){
  o" M" R3 R8 a* r! ]fread(& que,1,1,sourcefile);
" l  H+ z% p5 o; L1 s4 Mif (feof(sourcefile)){+ v) Y3 P2 U5 v, u0 w
break; }
; G0 Y- {* R" G$ G1 Dif (que> =0xa1 && que <=0xfe)
4 _0 `- w' p$ z+ o$ X//叛断是否汉字(BIG5编码)$ L. C/ S, i- B# g; s
{fread(& wei,1,1,sourcefile);7 I/ D: s" C7 Y, m/ o  f% n' a
if (wei<0xa1) wei = wei - 0x40;* D2 Q9 N9 |% s+ h7 Q* s1 ]
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;; U% q2 O1 |5 ^( E4 _# f7 ~2 t
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);( n( y3 ]1 K3 E. ~6 X) u
fread(& que,1,1,tabfile);" j) A9 E- ~0 d2 |* S+ N
fread(& wei,1,1,tabfile);
7 x2 @; K4 F0 Z5 n8 H/ [fwrite(& que,1,1,destfile);9 H7 R- l+ F- n2 U- n9 q
fwrite(& wei,1,1,destfile);
* ~3 s3 H' F9 l6 V" q}, o* a1 D& Q/ S- v) ?, w
else  u8 m' ]; m# h+ K9 A! E7 R1 P
fwrite(& que,1,1,destfile); //处理英文6 p' G4 a( i, S6 ^
}& Q  \! a7 b/ X1 H" \: [! U9 E, D
fclose(sourcefile);
/ y2 y! C* T9 Q, C9 v. z* J: Ufclose(tabfile);
6 L/ V! ^. V: B' j; L9 }fclose(destfile);
0 m8 z. U6 v* r0 e1 c' \return;
& {5 ?4 d# V1 T9 Y) K" D}
6 m- }' B5 ~- Z, a2 J* F  ]
! N! w) i- G/ n  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
9 V' B( ^) R# {" G% q
. K+ }+ P$ @* ]3 R1 c) m  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
" ]; o- d2 Y6 k! G( M/ t" F* w& X1 N* i
第一步 制作码表文件: B# q: z* N9 r) G
. b" E1 P& ]' u. W
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
" q" d. [( y3 j# @) M% O制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。5 W( m$ P/ ?5 v- q3 E" X. V0 U& P

: s+ H% q9 N7 X4 s0 e3 m/ E   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。2 [: v# e6 }  k; t! I
0 ]0 A* p3 a4 j
//TURBO C 3.0
# C' g& B& Q( y4 j. I. y#include <Stdio.h>
( G, l1 {: g3 ]& H" P5 ^#include <stdlib.h>
3 I9 f" b+ M% ~- G0 u! Rvoid main(){; Q  @* T3 g4 h* ]
FILE * codefile;1 {% t  `' o6 b. a
int I,j,k;& w4 l( U9 d9 R0 ]# o( h' I
codefile=fopen("table.txt","w b");
- J+ ?# {/ B) b9 L1 E  Xfor (i=0xa1;i<=0xfe;I ){
4 L2 p! p" q6 D0 m2 ofor(j=0x00;j<=0xff;j ){4 h( W1 y: p; j6 n' w6 @) r2 i
fwrite(& I,1,1,codefile);1 Q8 S% A" f; g& i5 d9 {
fwrite(& j,1,1,codefile);}+ V5 q" X; f* z/ C* W7 V& z
}
4 C; m! j* \" j* s+ W- o, c8 ]fclose(codefile);
  b/ U% b0 T% q0 {return;
1 c; ~3 X" E5 V, b/ U}
8 F6 p' G8 d- p; {9 S  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。5 @8 `' z3 H# G; B+ d, D/ q
3 R- m2 K  e! y; q! x' B! u

+ t! ~. o! O$ x第二步 转换( W$ j7 b4 r( k

" ~' a" ~) A4 Z9 A$ A; k$ S  v* v// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd# C; v# T. ?. d  K- F5 h' B  j
  下面的源程序,将BIG5码文件转换为GB码文件。9 \7 }. ~6 {( i% B. ^) _

- q" p7 t+ `% Z+ L//TURBO C 3.0# }0 {* q1 p$ D) e7 F& M
#include <stdio.h>$ f/ R" J" `* O5 m
#include <stdlib.h>
* _; r0 S  x3 X0 |void main(){( q! {' r7 I+ ?  [9 c) z
int que, wei;4 }: [5 N4 I$ F# t' ^
FILE * sourcefile;
& _' d8 {5 C0 h& E; }. dFILE * tabfile;
- o6 |8 R+ `2 f9 V8 |, b' g! k( ~FILE * destfile;- @) h! m: S8 k" a
sourcefile = fopen("big.txt', "r b");
3 r: m( w8 p- V2 n& a//BIG5 码文件' q8 @! n3 h! B# J
tabfile = fopen("table.txt", 'r b");7 R' ~$ X; M2 ]4 u
//码表文件
0 L6 \5 z" A1 a8 k8 W; x) Ydestfile = fopen("gb.txt","w b");: y4 ~  n% a4 i$ \/ p  A2 u
//转换生成的GB码文件7 X) O. ^2 R& F4 s4 a8 T
while (!feof(sourcefile)){
% r4 w9 a  t  s1 G9 z& }3 H- Zfread(& que,1,1,sourcefile);3 t$ V! l! K2 b$ q$ K( A$ L
if (feof(sourcefile)){- k* p8 K) `* O' N0 L2 w
break; }
# J, g3 m/ d& M3 ]if (que> =0xa1 && que <=0xfe)% Q. z7 _6 H0 c" W7 Z
//叛断是否汉字(BIG5编码)
+ H; ]: X+ r) P0 _6 g- \. o{fread(& wei,1,1,sourcefile);8 E8 ^0 f) b( |4 O5 C: m
if (wei<0xa1) wei = wei - 0x40;
( ]2 u6 [9 w- W. z" |/ f; {if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
  V# f# E% Z0 Yfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
, g3 M* v3 {# E/ Cfread(& que,1,1,tabfile);
6 S; Q: ~  A, s/ F5 F# {fread(& wei,1,1,tabfile);
6 U1 ~9 @+ I" M3 I: b8 F5 ufwrite(& que,1,1,destfile);+ @, o# Y# r# _$ _4 ?; }: x' O* U8 W
fwrite(& wei,1,1,destfile);
. f7 c1 N% O" k; g9 K& r}
. m- x- r  e8 x3 Oelse6 q! ^% U- L" d' s/ N8 d. N9 q
fwrite(& que,1,1,destfile); //处理英文$ h. g" w0 a4 M1 F4 _
}
9 q& g  o8 x# E+ Ofclose(sourcefile);. e& O0 l2 s) V# U
fclose(tabfile);
( E) Y6 C8 K: s4 ffclose(destfile);
8 b$ k* _4 ~, r0 Vreturn;
/ p/ U1 i. f) h2 K! ^}
/ W# H' e* }' y/ t3 W9 r- B+ ^# [6 C3 A. m+ Y
  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2