冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2009-5-17 22:48
标题: 【scummvm汉化】BIG5码到GB码转换技术
BIG5码到GB码转换技术  5 T: U/ r+ x' T" N; E" B% {
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
' }, D! x7 D& V' l" h) @4 `9 p. Q& k! G+ \3 T% m
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
8 q; [; m; r! F* C' _4 [5 t! c0 C$ ?1 ?' ^) {4 {
第一步 制作码表文件" j3 g# x+ S2 T, ^# Y" P
/ [" a( R; w7 g9 J) f1 \
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。3 C1 D5 e9 }+ [6 ?' A
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。6 `, F! k* ^# D& B- S4 I+ `6 h

( G7 ~- ~- ^& A: z  u0 `; ^   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。0 I6 A9 S: [8 R% ]# w( f: G+ U

$ i1 B" |' m6 u4 K  l6 X//TURBO C 3.0
3 S* \5 Y2 P5 A: |! _#include <Stdio.h>
! Z. b8 Z; S* s' _#include <stdlib.h>
& Z# ~+ M) |# L( s5 r. I+ evoid main(){
. e: G$ ]) R! ~# q" _5 iFILE * codefile;* [' R6 K# a& i) Z  Z' R) W" P# Q
int I,j,k;
  P1 Z& y; D  L# F: `- \codefile=fopen("table.txt","w b");
/ b. Z$ a2 C, K  ^7 s; Q0 ~for (i=0xa1;i<=0xfe;I ){4 j7 z- P4 Z) b$ k# ?' G3 [& M
for(j=0x00;j<=0xff;j ){6 y5 q# M: w, O) `
fwrite(& I,1,1,codefile);7 t8 n3 a4 ~' s+ s$ a
fwrite(& j,1,1,codefile);}
% R  W6 R5 n1 _8 c$ ~}
3 W6 T" w8 t1 w  C6 cfclose(codefile);
( \$ V) B% B3 K2 r: treturn;$ Y/ I( o$ \( A! f
}& O; F1 |( u) ]$ D! c
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。# g/ j; X9 L, X: }

* w: s* @! O9 P6 \% c) D! [' b
8 ?" y% o7 E. w9 [第二步 转换3 P, a' F; j. n8 u
# V/ n4 N' D1 h; s
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd1 s- @$ |2 X1 i  n5 T) ?' C
  下面的源程序,将BIG5码文件转换为GB码文件。
6 P! ~7 a: {( L" X% C# Z+ R+ E0 Z$ u
. m' z5 K5 J) \% y! B//TURBO C 3.09 j0 p7 V6 F. E) U6 d: n/ q
#include <stdio.h>
. r5 m9 p; ]/ j8 b0 `#include <stdlib.h>' T2 ?9 _- \9 h) O. C6 W
void main(){
7 S8 u- q, Y- F$ h+ [6 B" I3 V  V0 Uint que, wei;% o9 i8 V4 e( e
FILE * sourcefile;
) K' O& l5 o0 t; ~  @/ kFILE * tabfile;
; Y3 n% Q& S% `$ t# K# GFILE * destfile;
7 I: t- e/ p$ Z9 Asourcefile = fopen("big.txt', "r b");9 T. }% x  _$ ~+ Z" t
//BIG5 码文件
' {) j6 o  S" U8 ytabfile = fopen("table.txt", 'r b");
( y1 _1 V1 ^9 w8 @6 J; I- ~+ S//码表文件% L. ]( d: G3 V( V; q5 N* u2 q& p
destfile = fopen("gb.txt","w b");
& Q# F7 T1 D6 y+ B  _2 T: J: R//转换生成的GB码文件
5 u7 o9 }6 i; K  n+ V. @5 B% Y/ Fwhile (!feof(sourcefile)){
$ O) L0 e9 m! c, Nfread(& que,1,1,sourcefile);
8 A+ w0 W. z  s, Kif (feof(sourcefile)){
) N3 O3 l) ?( z3 S) d$ m& Cbreak; }6 m! u# B# l- O( L
if (que> =0xa1 && que <=0xfe)
) e1 g5 G, `) Z: y2 s# K/ ?* Y# G//叛断是否汉字(BIG5编码)8 `4 b5 y) d/ @* R$ H3 ^2 [" \
{fread(& wei,1,1,sourcefile);
3 ~2 K  V% q& t( Rif (wei<0xa1) wei = wei - 0x40;
) B5 O' l2 S! yif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
) `# ^  Q% |% m" n/ ~fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
3 `6 P* ~( M5 ~4 i) Lfread(& que,1,1,tabfile);
6 V; E$ B6 ~! B# @" h7 V4 xfread(& wei,1,1,tabfile);. |; D0 `6 W+ e' J/ z3 K9 i8 R
fwrite(& que,1,1,destfile);
- d" H; V4 K( U9 \$ _$ v9 S6 l) dfwrite(& wei,1,1,destfile);; o( K: g" E6 I% h/ J
}
: b" ~$ p7 j, H$ welse1 C' b- o$ [$ d1 N+ ]
fwrite(& que,1,1,destfile); //处理英文
/ w% T  ]4 I+ R}
1 E: k( s$ R4 ^' |fclose(sourcefile);
5 C! B) g- k$ Q7 S1 Y( dfclose(tabfile);1 M$ r$ M# T/ t% i  x3 n% ^" ~
fclose(destfile);
) E6 s2 t+ i% Z* V* Wreturn;
  a9 l/ o' A# i4 x}
; a9 u1 j/ B6 @( {3 `  i
' y+ b0 P8 r* K+ h# ~  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。4 G. L4 i5 w& m  r

8 k% N/ T6 k4 j; [  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。9 _! J' Z* c8 }1 R; h
! S9 @% m" s5 a2 @  a, g" d/ m
第一步 制作码表文件& L3 @% y1 u/ x9 G

% h3 I, Q, z, \# ]  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
# t3 Y& C8 ]/ p2 s$ o1 M: @制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。+ E% W- k- Q$ L' T0 [& {
7 y2 _7 l# B8 x7 y5 Q! l
   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
* p* v* T' o$ K# h# @% g) u0 y& X+ Y) g3 [" Y: M: a
//TURBO C 3.05 C$ ?2 s, i0 d0 ], A; F5 z
#include <Stdio.h>
- D3 Y9 Y( B  P#include <stdlib.h>
, H  s4 p' \, k+ F" Y9 @9 p6 Q  a% y+ Ivoid main(){
5 F* M$ w# C* `2 mFILE * codefile;' d- [2 p" y& G& y) J
int I,j,k;/ N6 i' K( O1 d* @+ }% D* K
codefile=fopen("table.txt","w b");
9 C% g' ?, p! M, e& Ifor (i=0xa1;i<=0xfe;I ){
: D, C4 e! ?2 m0 }; V! Zfor(j=0x00;j<=0xff;j ){2 S. E6 S% y$ V) L4 Z1 Q
fwrite(& I,1,1,codefile);
: ]& t4 M5 c, o# Qfwrite(& j,1,1,codefile);}" ], k- x" u4 y7 X
}
1 K$ Z4 }& W  x" Q- m, _fclose(codefile);
% m* O- N9 K% freturn;
4 \! E& j+ E9 F3 f}: B/ y$ }# v+ V4 i2 }
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
5 H* A5 w9 A& r% g8 S; l
$ ^: ~9 ?# ?2 }7 p  B
4 g- O/ Y* ]0 W; H0 L第二步 转换$ D3 L3 m& M  T# W8 ]# o2 e0 C
7 \1 o# ?0 K5 B+ |2 J7 L/ b6 m1 i
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd; z7 M' c: N1 y7 l
  下面的源程序,将BIG5码文件转换为GB码文件。" t& ]4 `7 _$ I; S
7 B0 o8 g# U5 L. L6 j, r/ V% u
//TURBO C 3.0
1 {. o4 r. \* o) t8 o4 [#include <stdio.h>
1 O" W" ^; _! m9 O) z2 E3 c& ]#include <stdlib.h>
9 }1 v- R! ^4 g; `void main(){
8 D) p8 A2 F  U1 J+ O) [0 ?int que, wei;: H( D8 j9 k1 r! m+ s
FILE * sourcefile;
) Y$ _7 N+ t; X- [/ T8 o" s' t' A* \FILE * tabfile;
6 u5 `9 b1 n  G; k2 [5 dFILE * destfile;" Q+ m. G5 L& y3 Q% {) d( N3 V0 Q
sourcefile = fopen("big.txt', "r b");, Z6 y' c) i4 W0 U/ Z" ]  O4 h! t
//BIG5 码文件
1 ^$ `6 V; [% k  \* }$ stabfile = fopen("table.txt", 'r b");
8 y6 k* W. b8 \. S7 p//码表文件
, P. }6 u: m3 S4 v, X' Odestfile = fopen("gb.txt","w b");
" e3 ]2 t- N6 u+ A2 L5 [$ b7 w( B//转换生成的GB码文件2 `% I& Q7 A, o# `
while (!feof(sourcefile)){
2 `/ X% y4 s! Tfread(& que,1,1,sourcefile);. u0 ]2 g+ w' j! X0 j# K9 N
if (feof(sourcefile)){/ C& F' U/ O& x3 e7 `* x
break; }3 O! X! s3 Y/ p
if (que> =0xa1 && que <=0xfe)- q6 `+ X* G% q, u0 r: P
//叛断是否汉字(BIG5编码). O5 J7 r  t' b7 d
{fread(& wei,1,1,sourcefile);
/ ~8 y. k8 x! T" \if (wei<0xa1) wei = wei - 0x40;
" C2 Y5 V. _1 `if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;* v' ]; c4 i9 q  N
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
+ K7 C  A+ C3 T- ?7 Afread(& que,1,1,tabfile);
$ X( H4 n9 c9 K; P, ?- `4 ffread(& wei,1,1,tabfile);
$ k8 ]* a" m) G) i4 S9 ]4 pfwrite(& que,1,1,destfile);
- l8 T0 E9 U- b  E( Kfwrite(& wei,1,1,destfile);
/ |8 l2 G+ }8 P& U3 L1 T}
( z$ i2 o. A; Y1 C$ a) R* @, Gelse
* A) m. Y. W# f/ y% Z5 Y* ffwrite(& que,1,1,destfile); //处理英文
/ f; G9 [( Z$ ~6 D& Z}. h( V1 W! q1 I% }
fclose(sourcefile);! u: t9 c: G$ ^5 T8 O) G. j
fclose(tabfile);# U7 D9 _, N+ W% P* Z- a
fclose(destfile);, v* I( K( t7 h! N( s; Y" ?
return;
+ t. l2 D; b- {8 L$ T* f}: T% p+ t# n( X- a

8 c& S0 v7 R$ Z) u& J  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。




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