冒险解谜游戏中文网 ChinaAVG
标题:
【scummvm汉化】BIG5码到GB码转换技术
[打印本页]
作者:
shane007
时间:
2009-5-17 22:48
标题:
【scummvm汉化】BIG5码到GB码转换技术
BIG5码到GB码转换技术
; A" E7 i5 z, x: ^* i) s" [% ^
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
; T Y" |6 F2 F
0 ]4 O' U- S# w; q+ c
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
/ f W, { X |( v, G
5 t% b* Y; ?+ t. Z0 ^% h" j$ a: b
第一步 制作码表文件
1 g! q; h8 V& m& g, e
4 v9 D0 f7 b8 s+ N
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
v3 `" f" g! b( b6 S
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
; c" V% T5 v$ a6 [! @/ E0 ]+ J. ]
; F6 J! C# X, y" j* S9 J& G- C* |
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
- K" c7 j( ^; Z0 `8 @' p
8 i1 c1 R, m9 y6 g* _* D
//TURBO C 3.0
' _& v Q( h( W. R
#include <Stdio.h>
8 L x( F* P; g5 c' R7 w" q. N" M: ]! i
#include <stdlib.h>
2 P3 _4 g/ }4 G2 \0 m
void main(){
, G: O! G5 g4 ?
FILE * codefile;
/ O7 q9 H, t' f0 \
int I,j,k;
; e2 P6 y( B3 D/ ]# B8 y* Q, y
codefile=fopen("table.txt","w b");
" l3 l3 b+ f1 m2 z4 K
for (i=0xa1;i<=0xfe;I ){
9 l/ Z7 U/ I+ K( S: [
for(j=0x00;j<=0xff;j ){
5 S3 P, y0 w8 u9 A M+ Z# S5 S
fwrite(& I,1,1,codefile);
7 }/ L1 D6 q" ]6 N4 n+ z( _" L
fwrite(& j,1,1,codefile);}
- w4 Q% U% G9 @( ^
}
5 \, k& ~- g; N0 L5 {
fclose(codefile);
7 H1 \6 a8 m$ }+ _+ c
return;
% ]5 r$ u1 O4 P/ U, P5 j
}
2 T# \) @/ Y( j$ E% j/ p
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
2 F/ o# _" b0 y5 K Z9 ]. U
" I9 i8 d* b1 J! G" t
) I2 p8 _0 _4 v7 k, O
第二步 转换
5 X6 s: B# y3 R; e/ B7 i" L% m
8 ]' C* A, i* c2 q8 E
// 本文转自 C Builder研究 -
http://www.ccrun.com/article.asp?i=166&d=8dgfdd
% w% e( F- f# l
下面的源程序,将BIG5码文件转换为GB码文件。
6 `# a* L4 N/ [4 r9 D
7 Q% G: D6 Y, i' k
//TURBO C 3.0
o4 s8 f, e. R' G0 f
#include <stdio.h>
0 O2 r$ L0 \$ z" | |1 W3 V
#include <stdlib.h>
7 ~( B* }( f" B% m
void main(){
$ \( ~ I+ B. b, I& f7 k
int que, wei;
3 M, N* N/ r2 Y O& s. D- x9 b# n
FILE * sourcefile;
/ Q: X# j- V w+ J7 v' |
FILE * tabfile;
- I- a" c, X; ?, ]" m; f
FILE * destfile;
$ @* t- v. ?: F' m# o& [# H
sourcefile = fopen("big.txt', "r b");
, i) Q# ~! M) m7 e9 l3 }
//BIG5 码文件
0 ^6 ]2 w- G! h* d/ ]
tabfile = fopen("table.txt", 'r b");
: ~; o' q6 c) A% T5 q/ H
//码表文件
. O9 C/ l/ c3 v# k0 Y, I
destfile = fopen("gb.txt","w b");
7 _/ ~* H) D+ y5 o" b
//转换生成的GB码文件
4 w& G, n1 K5 r1 i
while (!feof(sourcefile)){
# e, ?7 R( F8 w2 Q' o$ K4 |# A* w# i
fread(& que,1,1,sourcefile);
/ c! Q4 m9 L) l9 S u; T4 _
if (feof(sourcefile)){
7 I& K4 n' |. s' _ L* ^% W8 o1 x4 K
break; }
5 W4 y1 H4 H' H P( @
if (que> =0xa1 && que <=0xfe)
+ K3 V1 f: O8 y* V
//叛断是否汉字(BIG5编码)
1 d$ S- q" X) W3 s2 G9 X3 g" R
{fread(& wei,1,1,sourcefile);
5 P$ z$ u0 b9 _2 C! ]- c& ?
if (wei<0xa1) wei = wei - 0x40;
8 V( X }/ J; C% y" q! E( ^% ^
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
6 r3 e: A2 P7 f% `9 c0 e
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
7 X- f% s8 `0 R. ^8 [
fread(& que,1,1,tabfile);
7 ]- `+ }/ U- G4 P6 ~' z
fread(& wei,1,1,tabfile);
4 C) I8 y. W: `2 z, l
fwrite(& que,1,1,destfile);
( Q' \( e2 m5 A# R
fwrite(& wei,1,1,destfile);
9 }) Z( F3 ?2 r1 x
}
, u* g5 [6 L# a* R3 R* Q
else
6 j$ J/ a6 P5 q
fwrite(& que,1,1,destfile); //处理英文
' K0 h! q/ |. C& }4 _9 C- g+ v
}
; y l/ v' C9 |6 T% x6 F
fclose(sourcefile);
/ [+ s8 x t& `0 N3 A; t& o) @
fclose(tabfile);
% r- k: o3 U) h! C$ ]. x" E; }
fclose(destfile);
5 z4 ~) r: @8 o' V, y
return;
T4 p% I+ Y; b. s0 n9 u; c
}
4 C% v2 w' Z# L! C6 c
& D* w q# ?- H
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
$ t6 @. K5 u% ~
% b) B% r2 Z. q
汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
" ^4 F: d+ S" \% [6 i* u# O( P# M
& Q" ?3 Z3 A v! S) ^& j! Q! j
第一步 制作码表文件
! p7 ]* w) s6 d+ J
2 O" E# `( l2 v1 u, e3 s* \
BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
; \7 ~: ?3 t, T5 n5 X
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
8 z( F) f# p3 }4 k/ d: x2 |
* w7 c/ B9 W' _1 Y, R9 U; U* D
下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
. q7 \. F& p. j' @; ?7 m2 p! d
9 B/ Y& n7 M c" s4 [
//TURBO C 3.0
- ~* C8 |1 ?9 D D# ?
#include <Stdio.h>
: a$ B0 [, A" u% X+ r9 W1 ]! d
#include <stdlib.h>
* ~9 C# k5 H2 M8 S; T4 Y
void main(){
& P, R6 r9 m8 _
FILE * codefile;
' K1 o6 T% q5 r* t- c' y
int I,j,k;
; n, z6 i, I6 r; K5 v
codefile=fopen("table.txt","w b");
: ]' w& P: L2 G( m1 Q
for (i=0xa1;i<=0xfe;I ){
- a! P* P/ S. u. g: P/ m
for(j=0x00;j<=0xff;j ){
2 H. L# f/ y, u: P( g% l( \& L
fwrite(& I,1,1,codefile);
/ V. X5 u. e. I3 M. P1 O4 y2 ]
fwrite(& j,1,1,codefile);}
, K+ A4 v0 e% G! P1 C: B! F4 W0 L
}
4 j! a$ R B; E5 P4 ^$ v
fclose(codefile);
M+ _& N1 \; B+ D! z5 l
return;
/ ~ o* h9 k: M% y2 w
}
# U" C0 i' y9 W6 I
运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
3 s+ H* j9 B6 A
$ {. ^ V6 N: p0 l5 W1 _- t2 s
" P0 Q1 w2 l$ C6 w: W) a- M# e
第二步 转换
$ [- _" k5 l8 a& c
% H1 R/ J) p2 a! O% M
// 本文转自 C Builder研究 -
http://www.ccrun.com/article.asp?i=166&d=8dgfdd
. v6 c) E# `* K7 }+ O
下面的源程序,将BIG5码文件转换为GB码文件。
+ Y- x2 D# e) V9 _6 e
+ \7 A! T8 K" A0 d
//TURBO C 3.0
& K8 M# X. M+ {% s
#include <stdio.h>
5 ^; ]% [. U- e# V- z; L. g- j
#include <stdlib.h>
1 N; H, ^, P" r; m
void main(){
% H: y( z& F: O8 z
int que, wei;
3 k* F F: O6 I; x, o6 N+ \5 z
FILE * sourcefile;
$ B2 E/ u) ]+ F8 X
FILE * tabfile;
e% E8 V- T$ S4 `# R0 {" N
FILE * destfile;
) M9 N6 o; Y* p1 t
sourcefile = fopen("big.txt', "r b");
( L' o9 I# }# t1 x# \9 o
//BIG5 码文件
. S' T J: n- O5 X0 f1 b+ ?
tabfile = fopen("table.txt", 'r b");
4 L8 z9 Y2 A& Z0 }9 ?9 `( X+ k
//码表文件
. s* O; Y3 w) V
destfile = fopen("gb.txt","w b");
; [! N ?: s+ L+ \4 g
//转换生成的GB码文件
4 ]5 C; B5 [- k3 ?+ X3 ?; W
while (!feof(sourcefile)){
/ [6 R) h' L+ k4 _5 M9 M
fread(& que,1,1,sourcefile);
9 ~1 }) m/ y7 V0 c) w) G' L8 e0 S
if (feof(sourcefile)){
% L% O4 E2 a5 Y! b1 ]) o( m
break; }
3 g4 a s- c. x5 y! _" } k' Q! _% Z
if (que> =0xa1 && que <=0xfe)
' E& |2 v7 {! Q. Q o1 J" Z' K
//叛断是否汉字(BIG5编码)
( N6 q, K& g1 O5 L/ O
{fread(& wei,1,1,sourcefile);
3 c3 t0 C) _* b2 @, _ c* w* p
if (wei<0xa1) wei = wei - 0x40;
7 z: U/ k; R2 ]' u
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
" y1 ^! x+ @5 o& C! v( b) r; Q
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
0 w! g" d+ M% H7 _) u) ^
fread(& que,1,1,tabfile);
* m% r% S, ?5 u1 G9 w: ]
fread(& wei,1,1,tabfile);
, T/ L+ o Q' |( [7 ?
fwrite(& que,1,1,destfile);
4 n, x9 c6 S2 x9 S
fwrite(& wei,1,1,destfile);
3 ^0 {) w& X I2 L, f' z( |( |
}
: j/ c( y0 e9 r3 x o A# q
else
: x, m: x9 i k, c8 e6 l2 {
fwrite(& que,1,1,destfile); //处理英文
7 ~5 a/ G$ h0 J0 ^. l3 I6 W" d
}
+ E! C; g1 }/ _9 f5 d
fclose(sourcefile);
" D4 {# X6 L/ k/ {8 h$ b
fclose(tabfile);
1 p) m% i# e+ X2 k0 V$ X+ v
fclose(destfile);
0 Q; [6 M {3 A7 [4 M
return;
+ V7 L2 A* r1 {
}
& L* [( H+ o4 f9 @
- u! B: f! a: ?
以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2