冒险解谜游戏中文网 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. j
void main(){
% @. l& _& P @3 P, h
FILE * 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% V
return;
* 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: n
0 j* m& a8 i8 X+ T$ r$ v% L2 _* l
第二步 转换
# d# a F% Q. _2 _* F x- N
8 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 i
FILE * 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/ n
tabfile = 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 r
while (!feof(sourcefile)){
o" M" R3 R8 a* r! ]
fread(& que,1,1,sourcefile);
" l H+ z% p5 o; L1 s4 M
if (feof(sourcefile)){
+ v) Y3 P2 U5 v, u0 w
break; }
; G0 Y- {* R" G$ G1 D
if (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: U
fclose(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! R
void 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 X
for (i=0xa1;i<=0xfe;I ){
4 L2 p! p" q6 D0 m2 o
for(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; }. d
FILE * 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) Y
destfile = 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- Z
fread(& 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 Y
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
, g3 M* v3 {# E/ C
fread(& que,1,1,tabfile);
6 S; Q: ~ A, s/ F5 F# {
fread(& wei,1,1,tabfile);
6 U1 ~9 @+ I" M3 I: b8 F5 u
fwrite(& 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 O
else
6 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+ O
fclose(sourcefile);
. e& O0 l2 s) V# U
fclose(tabfile);
( E) Y6 C8 K: s4 f
fclose(destfile);
8 b$ k* _4 ~, r0 V
return;
/ 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