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

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

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

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

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

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

BIG5码到GB码转换技术  1 [# T" M4 [2 e% N& G5 P. j$ _* Y
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。4 u/ j- i7 Y1 `

- C. Y: V. P7 J" V! r  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
8 g4 k# f) K: P8 N( W
" l! N  Y) r/ C; ~+ g# J6 z第一步 制作码表文件
6 ^+ R% d% R7 R8 R" E  d
! N5 K3 T( N! l8 T4 _  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
- j7 |+ r$ ~) z* G/ D' H* Z0 j制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。- t6 d6 y+ {- G8 V2 V3 l
; z; {7 ?: g  U1 f
   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
! E: X1 K6 O' {* r4 p4 c0 I& V+ x
//TURBO C 3.0% E3 T( }& d6 O) E- B: ]9 ?+ e
#include <Stdio.h>
- a/ w: L/ T  i#include <stdlib.h>$ m; M! K. Q2 [" B0 s
void main(){1 `9 X1 z  Z7 G/ ^: v
FILE * codefile;, w1 P- G: I$ F* M
int I,j,k;5 V- O9 M3 e; `9 K# O
codefile=fopen("table.txt","w b");" D1 {5 w6 u+ A0 o) E( V) h
for (i=0xa1;i<=0xfe;I ){6 U+ o& {0 n1 v) P
for(j=0x00;j<=0xff;j ){
4 ?8 R8 C& ?- s$ W; Zfwrite(& I,1,1,codefile);
" V) P6 m5 s0 E8 |; j. Ufwrite(& j,1,1,codefile);}& ?4 B7 c, x; d/ e. j" ]  J* q3 J
}
& T  P6 G  @8 Q/ nfclose(codefile);7 `- x. a/ L3 \  j
return;9 U% j# X9 L: _4 p$ o8 F- r9 K. N
}
& d" b9 Z4 ?4 V, B9 f* N  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。3 C9 @0 b: r: T
/ j2 R. x2 _9 V' m5 K! F
" t6 V$ |8 w5 j9 O9 i4 `0 U
第二步 转换
' u- {: Y. K- m6 d) d! [6 @% Y# S- W' B8 ?% N) ~
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
" c1 s/ ]- J! c: \9 u  下面的源程序,将BIG5码文件转换为GB码文件。, ~" y7 K/ E9 g) f6 f
% M4 O5 e& I2 A5 j% S/ m3 u% C4 u& L& p
//TURBO C 3.0
6 x0 d# H; D3 h9 c4 `! }' A, ^9 Z#include <stdio.h>, x# r5 h$ ^/ v# S
#include <stdlib.h>
* b6 {0 H! w& ]4 y" a, e$ \! N  Mvoid main(){4 A1 A" _+ x, r! `0 k' d: l
int que, wei;
3 u+ F% d/ z! ?. L& y2 MFILE * sourcefile;* t: |# T* V" S, |+ w3 c
FILE * tabfile;% k6 r  T, X. Z& R# Q6 j
FILE * destfile;
0 ^3 C# `6 {# ?( F, rsourcefile = fopen("big.txt', "r b");* P' q  e+ @+ x8 C8 `
//BIG5 码文件
  b, P: K3 @" Btabfile = fopen("table.txt", 'r b");
( X2 k0 L! I/ N' K% |) s//码表文件- E  N. y) e. W3 [8 ~
destfile = fopen("gb.txt","w b");6 K8 ]7 F  l  M& [
//转换生成的GB码文件
1 k; {4 L/ O  ]+ Z! cwhile (!feof(sourcefile)){; P/ M. d9 ^- q, q) |# A
fread(& que,1,1,sourcefile);3 @0 ^5 E4 m% h9 l
if (feof(sourcefile)){
$ D& J% s  H4 Vbreak; }1 N" H) ^, J8 @. r4 i$ x
if (que> =0xa1 && que <=0xfe)1 g" i3 w* ^8 s3 d/ w* `' b
//叛断是否汉字(BIG5编码)
9 h% x8 b1 ]7 o- }  V" J{fread(& wei,1,1,sourcefile);
. _# v: ^% t6 c" \2 t; i. h) z+ xif (wei<0xa1) wei = wei - 0x40;8 M( U) I2 u4 H5 a  Q8 B
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
' H& N. p% E0 l( V7 _: yfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
  E8 ?( @  \1 m: p( qfread(& que,1,1,tabfile);
) V. q& Y: T+ mfread(& wei,1,1,tabfile);
" L4 h/ p8 f* w! wfwrite(& que,1,1,destfile);' E& S8 k5 C, K  z( l" S
fwrite(& wei,1,1,destfile);
1 V  V& }) W6 ^; y% B* `}
0 v9 J. q0 p) A" W6 o0 oelse* r# [& I, k* U6 v5 U$ h4 a
fwrite(& que,1,1,destfile); //处理英文
# Y) j( @" z2 T) m0 h4 ^}7 l6 q8 @5 g$ ?
fclose(sourcefile);/ t. D* s7 H$ D  @2 i
fclose(tabfile);
- i. f* S" Y& A  w; l* afclose(destfile);" i% I% N# j' z9 D
return;) `( _2 c0 Q; y( d
}
' T8 S; V+ l3 Q! Q! S& d) ^4 X. }8 ^: _* _& d
  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
8 F8 c' R  m! T% K! t0 C4 e* Y. d0 Z- J# q9 L
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
, _0 v) F1 l3 m; Y2 C5 Y2 g$ m6 C& M1 u6 F
第一步 制作码表文件
$ b; |5 x1 }7 f7 ?: ]0 `7 s
/ A: v" i- a' t( o4 g  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
/ p6 g* \- D, L9 S' g6 H# o制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
* c8 x3 Z  J! p- {$ \0 e7 F' ~
  N1 \2 B& u7 W& g   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。2 P1 ~5 f5 k3 z; R9 H
1 ?9 m- k8 Q& F/ g1 ^8 S
//TURBO C 3.0" d) t9 c# ]& d$ K4 v
#include <Stdio.h>3 Q. `' }2 K" i* o8 `6 h: h( e
#include <stdlib.h>( c) A  L+ \& T
void main(){) w0 y! [- l' O8 A- K- y
FILE * codefile;
& |# q3 ~  q. u+ ?/ y9 Aint I,j,k;) @# E" W- P; u0 E9 j5 t
codefile=fopen("table.txt","w b");0 s* z# `! G: q0 G3 j, S
for (i=0xa1;i<=0xfe;I ){
' @, ~5 m9 u. P5 z9 {# afor(j=0x00;j<=0xff;j ){  ^+ Y& U8 V. l( q$ v6 x7 l
fwrite(& I,1,1,codefile);
& V2 d0 o2 M, c1 G/ n- k! J- tfwrite(& j,1,1,codefile);}
6 x/ \! d" h; Q) `& e! q1 k}
9 E$ R3 m( q# q+ \' xfclose(codefile);
$ r1 ^( B' L" T. \/ Mreturn;- `5 C( c0 Y/ w9 r. t
}& T4 S9 K0 |2 f( F, l
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。/ g; K8 Q& ~5 v# Q
- ~; _! j& K/ x: @0 ^+ x2 N

) I- y. \7 [) T8 k0 `' v第二步 转换
, C" h1 U4 w' E# q
: K4 G9 j; V/ ?9 s" ~$ u// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
7 H$ r# e& k% r0 J( c  下面的源程序,将BIG5码文件转换为GB码文件。$ j' y2 s/ u7 f! ?8 B
5 x6 b  J4 o& G, W0 W
//TURBO C 3.07 ]0 S6 G% @7 ~- t
#include <stdio.h>4 Z7 }# v" n) |0 y
#include <stdlib.h>
5 \& J) Y9 W! o# kvoid main(){
" k& `+ e5 C5 d) A( eint que, wei;# a# h5 \- z3 J: u( Z7 L$ L  D
FILE * sourcefile;
) O  O1 y9 p" x. ~$ wFILE * tabfile;0 ~0 r; v+ r) o+ W
FILE * destfile;
1 F3 }8 i$ S$ H# V  X8 q6 v, A! zsourcefile = fopen("big.txt', "r b");3 p( [$ @, g' v3 H
//BIG5 码文件
: m7 \9 o" E( N  G7 p3 utabfile = fopen("table.txt", 'r b");: c1 e  p" d; G! M7 g6 [+ M* |
//码表文件
3 F& F& X2 o7 g/ y9 Y2 a* ldestfile = fopen("gb.txt","w b");  f. o  q, m- d- z8 N: m" Z9 h
//转换生成的GB码文件
- Y/ f" m0 w& {while (!feof(sourcefile)){. |' f1 v/ j( O
fread(& que,1,1,sourcefile);
- K3 {" O0 H! w# o8 S1 g# P; [if (feof(sourcefile)){) O0 H  L( Q3 W+ {: t$ F5 f1 X
break; }7 C1 p/ @2 y7 F8 P/ ]& u# I: m
if (que> =0xa1 && que <=0xfe)& E2 d5 C; g/ `" L8 f  V) x1 i
//叛断是否汉字(BIG5编码)& A* e1 P! S4 n6 m$ C
{fread(& wei,1,1,sourcefile);
7 T9 i0 q9 b6 o: t5 y$ H. l2 k) x- F  ]5 ?if (wei<0xa1) wei = wei - 0x40;
8 v/ j. G* u/ o( D; n( t8 yif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
# g0 S  r* N! Y8 ], Qfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);4 H$ h0 l8 Z4 T( f
fread(& que,1,1,tabfile);1 p! _7 k) H) L8 l0 c1 [
fread(& wei,1,1,tabfile);# Y7 E+ Q9 P" H4 l8 N( `
fwrite(& que,1,1,destfile);
0 D: Y9 x3 m) \6 K% ]0 Cfwrite(& wei,1,1,destfile);
/ t7 m2 e, p) X6 x$ B}% V( y. @# Z) t; I! \
else
8 c6 G# m* [& C! J3 e0 Mfwrite(& que,1,1,destfile); //处理英文
/ Q! |" t5 z" f4 T}
( L6 k3 d7 [/ Yfclose(sourcefile);
5 n  ~- Z! h& p: K& r" {fclose(tabfile);
& n/ ?1 r0 O  z( W$ Tfclose(destfile);5 E; Z$ \% L  N0 Y/ D
return;
  Q% f- H% K! [7 H0 D* }0 Z% e}
+ r9 t) ]$ c! t$ f+ D0 o, _0 n/ Z$ K0 R& v/ [: A" Q
  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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