设为首页收藏本站官方微博

【scummvm汉化】BIG5码到GB码转换技术

[复制链接]
查看: 1441|回复: 0
打印 上一主题 下一主题

【scummvm汉化】BIG5码到GB码转换技术

跳转到指定楼层
楼主
发表于 2009-5-17 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【scummvm汉化】BIG5码到GB码转换技术

BIG5码到GB码转换技术  
' E+ L  t2 y* j2 B& u! I# }/ z一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。! a* ^3 V+ u$ \9 y

/ c" ]2 c$ H/ }& ]. |  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。( r& p" G* N) P" ^2 U, {+ r

# ?! W, U! T. f' F9 w- x第一步 制作码表文件
3 S( g% P9 b" C: b/ m, O
* q- g( H4 o. H% V% R1 I  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。3 R+ E1 z' y  C& V) D' `. R
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
+ t1 n4 g+ n/ Y& E. e. V4 r
: e! ?8 Y. D7 d/ x2 {   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
9 x# ?2 T# q9 }0 R8 n3 g! V) {! w
1 O; z  d* u7 q- t, t& G//TURBO C 3.0
8 r! T7 S: i) |9 _. U#include <Stdio.h>1 ~9 c, n4 i, _7 F& P6 a0 C2 F
#include <stdlib.h>
/ p& w; Q/ k" {8 m7 O0 Cvoid main(){
% E# }$ }7 j/ U' c% i( O7 CFILE * codefile;6 Z& C) [( V# e! l! q! X- M7 v
int I,j,k;/ ~( t6 T, B+ [2 a0 J3 V
codefile=fopen("table.txt","w b");
6 k" @4 X2 Q* L- ^for (i=0xa1;i<=0xfe;I ){4 }& f  {" Y: q4 z8 A
for(j=0x00;j<=0xff;j ){
; A3 n8 `6 g" r, n# S; [fwrite(& I,1,1,codefile);; M+ j# y+ s+ ]9 K" s' l$ x# @- Y
fwrite(& j,1,1,codefile);}
% y' I0 J# o. W& H' i7 I}$ ~9 r+ k5 J0 R; H; \
fclose(codefile);
# |, B& _8 z, P, E  {4 f) Mreturn;
' ?5 n: e* x; \; R! A}0 P, ^$ V: e. S& h: `
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。7 E/ p" j& G- [* u" z1 w! @
  [% V+ x' v, {+ L  T# ?
  }' Y' B5 @6 s
第二步 转换
  N& r2 G1 E( ^8 [2 {5 ?; Z6 P7 l) j8 h7 @7 Z$ H/ E' {$ N
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd7 h5 n& U$ p, ~8 r+ F
  下面的源程序,将BIG5码文件转换为GB码文件。
, [7 P3 `; f* h  y# g# n( V
3 w4 q$ x: b7 Q) c. Y8 U! `//TURBO C 3.0
/ \3 L8 b  i. ^  W' I  G#include <stdio.h>
) y' a+ B" d  g, g$ Z; A#include <stdlib.h>6 v& t0 O5 U: J, @  d9 k
void main(){
7 S) w5 y& w% m6 v4 bint que, wei;0 \9 O* b4 a8 ~/ P1 ~
FILE * sourcefile;
( u- w8 G7 X  EFILE * tabfile;# I/ x8 \' ?& K  a
FILE * destfile;7 ~* L" ^0 d! W/ N' ^( z. E
sourcefile = fopen("big.txt', "r b");5 q; m! y3 O- M2 }3 v( z
//BIG5 码文件
- i1 z, u. a3 ytabfile = fopen("table.txt", 'r b");
4 Q$ F, W# S& F- q9 r& R4 A//码表文件0 k3 y* y/ X/ y5 H3 t) m- W0 p6 T
destfile = fopen("gb.txt","w b");7 q' t8 W% h% v; j0 h
//转换生成的GB码文件
+ N) y  M# e; G6 ywhile (!feof(sourcefile)){: z+ }) }7 W* n. p6 ]# F) w" o
fread(& que,1,1,sourcefile);
8 r4 _8 {) ~3 ?% L0 v* {5 q/ `if (feof(sourcefile)){
& s8 `- r4 H1 Mbreak; }
) L. X6 n' {$ u( m  g# S7 U5 s6 }if (que> =0xa1 && que <=0xfe)
8 o3 `: H( [+ k' @/ C: X//叛断是否汉字(BIG5编码)
, R4 @! u3 j* n/ n+ f( c{fread(& wei,1,1,sourcefile);/ H) t$ ?* ?4 Q" ]4 ~3 E
if (wei<0xa1) wei = wei - 0x40;8 v4 q- [& M; ~9 t
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;) K! j7 d( |2 F
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);0 h7 b* G% ^6 c2 H" Y% |
fread(& que,1,1,tabfile);: L/ E! K2 @5 {, c1 Z: q, S: v
fread(& wei,1,1,tabfile);! D  X3 x8 C& d5 K1 @! r
fwrite(& que,1,1,destfile);- ?& S) ^, g8 I$ Q- y" G+ L  _
fwrite(& wei,1,1,destfile);3 i4 T- l' G+ T% o7 Z
}
7 Q3 s9 _# T( T% t# ~else
( x$ n+ ?! K7 R1 b% ~/ m6 _- ~& Q8 dfwrite(& que,1,1,destfile); //处理英文
% h1 J- x" g- U}
( N- t; x4 M; t3 t- [1 ifclose(sourcefile);
6 i; U, R: h+ ^" I0 |fclose(tabfile);
( r8 M0 c5 ~7 a0 W7 E, _# a0 gfclose(destfile);
6 g+ l, v; p2 freturn;" f' _4 w7 j( k
}
! U; O; p$ d1 O& A
8 \# s, B) `1 Q7 j  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。- `- z9 z2 O6 o7 ~( }  z
! D: b+ z1 O( v$ X1 F: [7 z( ?
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
* Z6 e# m; O; L& [& A2 F% q. r- G% T: e
第一步 制作码表文件! [) v" @$ M/ W+ Y+ M0 w7 [  M
9 m6 D. t3 q! K* V. X5 k
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。, a$ G1 ^/ D8 o% J1 z
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。0 ]- Q6 o0 A: S  l# ?* L$ ?

: d9 p$ j' e7 J. S2 L& J   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
+ c7 ?+ v3 Y7 Y: e" z4 G0 f
6 `" P8 X' u# {: ?2 v( p//TURBO C 3.0
1 k5 q5 l! w# u& j, x0 p. H3 t5 I$ h#include <Stdio.h>
$ _: {6 G( ]' G  a1 R# [0 B#include <stdlib.h>
& O1 z4 h5 T: w  h. Lvoid main(){
6 F; {. v4 N: y* e) _4 q& ~$ ^. \- FFILE * codefile;
: h2 x: t5 Q: ?7 }3 G% c: i# qint I,j,k;
" a  X/ m& ?' A& x6 X  B% [6 |* acodefile=fopen("table.txt","w b");3 q+ E" J1 Q0 l6 U
for (i=0xa1;i<=0xfe;I ){
+ ]# h# ~/ o: H7 yfor(j=0x00;j<=0xff;j ){
3 P- t- z3 V  P. jfwrite(& I,1,1,codefile);1 t& q$ b: E8 P# j, @2 ?: S; Q: l
fwrite(& j,1,1,codefile);}
* i- }& m% I' R6 n+ E}; h$ j9 ~1 O" J1 G. _
fclose(codefile);
7 ]; u4 n- X5 M% I' S" wreturn;! c1 a: i+ C) `. T+ \: z
}
; q: {5 }1 E$ J9 A7 z& \  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。( z3 O: B% U; L& u! b: E

% q! W1 k/ ^) o% L4 L- ]) p
7 f, c1 p5 D' t: L" ^' x7 D第二步 转换- O0 z# S0 P* e' t5 h
6 J. t6 w- k9 o/ B5 \3 [
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
1 G, r4 _, n$ L) _2 h6 J0 g  下面的源程序,将BIG5码文件转换为GB码文件。
. @/ J8 I) c1 W0 {7 G! |: v* |( i' m& O" C  T
//TURBO C 3.0: n/ d8 w& u- [1 f7 F9 R2 r
#include <stdio.h>
: O4 w' }2 j% |#include <stdlib.h>
& G$ I* X* m( P$ Gvoid main(){1 F6 ^& ?! }! a9 v7 I: e6 ^( h, [: Q
int que, wei;
- N+ D$ `! \7 a0 f0 P- `FILE * sourcefile;; K; W* m& I/ {7 u5 U
FILE * tabfile;4 ?+ [5 V- y( x" ^5 E  m# J
FILE * destfile;
& o& |* B$ L4 K% E% }* I' w/ M- G4 Csourcefile = fopen("big.txt', "r b");+ r  g9 N: \/ `3 Q7 }
//BIG5 码文件
  L4 e  G5 h+ l% ^0 O4 E. ltabfile = fopen("table.txt", 'r b");2 L0 T' ^+ f. a) n& M
//码表文件  Y( ~& q2 E: S( U, P0 k8 m- ]4 y; H
destfile = fopen("gb.txt","w b");
; t  X) w3 X( P& R0 E  Y* \//转换生成的GB码文件, A+ V3 E& N! A: O; A4 S; s& x7 v
while (!feof(sourcefile)){0 g3 Q2 |' E0 d( W" ]
fread(& que,1,1,sourcefile);' p( p- @" `. w0 c1 i
if (feof(sourcefile)){$ {/ Y, ]( @, u1 U
break; }
, G& B+ D6 A& y3 o  q; l% ~if (que> =0xa1 && que <=0xfe)0 j' P9 L0 D. H7 S
//叛断是否汉字(BIG5编码)
+ v6 V( I5 v( f# M% O# e{fread(& wei,1,1,sourcefile);0 N, S( w3 P* j8 d* M5 A
if (wei<0xa1) wei = wei - 0x40;% ]6 \5 J8 i9 Y5 t0 D
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;2 S  d. X, @( |, [
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
/ @& p0 X  [$ D* E6 r  Efread(& que,1,1,tabfile);8 l) a3 K* x/ N
fread(& wei,1,1,tabfile);1 Q( b% `* z. X6 G" W- {
fwrite(& que,1,1,destfile);% _- s: E8 Z8 K& V# z* |2 f
fwrite(& wei,1,1,destfile);" r5 z# d& \! q6 t, b
}
( l* u# G/ d5 Jelse
: W; J$ i& W! J% h7 gfwrite(& que,1,1,destfile); //处理英文2 n% p4 e: }- U% |
}& T5 j5 N' f' X" b# |, u
fclose(sourcefile);
& B9 n7 `3 j/ {  R' S( C+ T& n. L# Jfclose(tabfile);" Y2 N3 S3 u4 j: s( H
fclose(destfile);
3 A+ `" k" ?' g4 p4 Areturn;
7 }0 e- p8 a) ]0 D; d' O! j- M8 r}
' W/ C$ Z1 z7 w# ~' J5 J6 I
6 H- J. ^0 w# O5 f5 o9 A- j' x1 j+ `  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表