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

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

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

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

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

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

BIG5码到GB码转换技术  $ h! ?2 ~% l. s& M
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
% D: o! ~, l0 \- o& A' O
9 E0 v' q, F9 W! T. Y  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。2 I+ r$ K# y/ |9 [% W( [

6 n& a6 d) f' \. M  E第一步 制作码表文件# H+ _0 M* O2 v% o$ I0 r/ }
% d% d% w5 R: ]7 ]' p% m
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。8 L) v( u# g, Y9 \. z5 @9 ~
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。' P2 a; T: _- `

5 o4 e. f% g5 E8 Y- E$ Q2 E   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。* K  [5 Y6 I; L0 J

4 r4 |; g9 ]9 ?0 K//TURBO C 3.0
/ ^  x+ g6 E% W- l#include <Stdio.h>
+ b! S6 C: j/ {* Y; V% U/ b$ R#include <stdlib.h>
3 f- R# g, ^; V4 q6 w* |void main(){0 z. w4 N. Q; V8 q$ x2 i7 N; B4 W& d# i
FILE * codefile;8 S, T/ f. C  m1 ]
int I,j,k;
0 Y9 J6 I$ l6 H% `codefile=fopen("table.txt","w b");
% K7 I: m. Z* G6 b: U; Dfor (i=0xa1;i<=0xfe;I ){
. d% n% ~# n, `: bfor(j=0x00;j<=0xff;j ){( t( E9 `% X( }/ H* L2 X/ q
fwrite(& I,1,1,codefile);% N( Z1 H+ [+ X8 b( v' ?( ]: \
fwrite(& j,1,1,codefile);}/ D8 I) H) E, X% @
}
* F7 p) \3 r" q8 ^: Mfclose(codefile);
' y' Y; i- N( e$ Y0 l  Vreturn;
6 |$ \% `# X/ l. Z$ K  Y- N3 p) v}
/ ]" c; j8 }6 b* V5 G- }6 h, R& @1 H  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。6 N4 g: q1 q; w  ^9 ]/ E$ c( ^. u, K
& ~7 `2 H6 B# p$ U0 a  X0 D3 F0 J/ R
% a* i" j4 B. V2 d& y9 [" `
第二步 转换% j/ Z# p. Y, I" l. F: ^7 {% K+ f
" A& u7 Y7 q* N3 u: O* ^+ {
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd/ x" M% K6 v3 V5 m; z. k( e3 L5 J
  下面的源程序,将BIG5码文件转换为GB码文件。
8 t( a- R: Y1 w4 s9 @
! ^: c3 I; x# F$ r) X9 r//TURBO C 3.0
4 [6 g- H" c8 y0 o2 Y#include <stdio.h>) `; d! a+ Y: y" H4 C' M
#include <stdlib.h>, Q9 e( N! U4 [; ?& `. d
void main(){
$ `/ j: i  f6 W8 v. Hint que, wei;+ Y5 \9 u- F( }, X* D
FILE * sourcefile;8 ~' `3 X- V# F' u
FILE * tabfile;, A9 T6 H& C7 t* v. a  x- K8 h
FILE * destfile;. u  a( V* u( j
sourcefile = fopen("big.txt', "r b");5 ?1 o1 u5 ~; w& t% w% h& L* i
//BIG5 码文件9 d" @( ?$ y4 R1 q( |/ X
tabfile = fopen("table.txt", 'r b");# h) e% }+ K/ z5 ^% l$ o
//码表文件! i' S  z% v. d. F$ N$ j! \, l
destfile = fopen("gb.txt","w b");6 n% \( v8 t6 o
//转换生成的GB码文件& M, J, m0 w) }, }8 h
while (!feof(sourcefile)){
) `7 V+ m$ Z. L+ y2 p8 [# bfread(& que,1,1,sourcefile);* N  _6 u; [4 S( O' k' X
if (feof(sourcefile)){
( ?' f5 C0 v& H$ T9 S# ybreak; }. i. J2 F! m  ^7 F. S
if (que> =0xa1 && que <=0xfe)
! F. W, Q$ S3 |0 ]4 q9 ]0 j2 \! ~6 d//叛断是否汉字(BIG5编码)
7 h. V: h) t9 I/ q4 j- w{fread(& wei,1,1,sourcefile);* t" h9 b# B' O) X5 A7 Q  F
if (wei<0xa1) wei = wei - 0x40;' `! u+ h7 c1 i8 |9 L
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;3 B1 P: r: C! a2 `, w' R' a* r
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
9 z/ W- u5 Z! h+ s) d9 s# yfread(& que,1,1,tabfile);
- Y, D# Z: ]2 sfread(& wei,1,1,tabfile);
# @) u. ~% s6 s; c7 X, ]+ b+ H# t# Ofwrite(& que,1,1,destfile);
' [$ V, t; u  I" r# o; Z) a/ ^fwrite(& wei,1,1,destfile);
9 s5 R# L% a  l4 @1 x$ G( \8 f}7 D7 {' Z) ]" m7 L
else
0 D  x- w' S& [fwrite(& que,1,1,destfile); //处理英文
6 }) j1 j1 G8 S1 Y4 p) L+ B3 \0 G}! W$ b/ e' M  K/ {# u
fclose(sourcefile);
2 D- m% M  e8 p6 gfclose(tabfile);. b, r3 a1 _  y
fclose(destfile);0 j4 Y/ e$ C# g+ s
return;: L9 s4 t3 [# P8 M: k
}
+ Q) U: W2 d! v. o! q. j
/ T$ K1 u0 {$ T$ p( b1 \! q  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
8 `, `6 _) L' u! Q/ M2 e0 Q6 H) q
: d" I+ n) E/ h' Y5 i& e  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。6 z! V; E8 E( h4 v2 D- F# q; E

  \& G7 P+ P4 }; r/ f. b# x第一步 制作码表文件# c' v" Y0 q! A9 p4 [

$ C: x# K/ v2 Q0 A1 r  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。& U! G. Y5 \! r% o) `6 Z. ?+ ?2 G
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。0 O8 }' |7 K5 c

) ]5 Z; f3 U! k$ b- ?" z( o   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。' x/ B% k/ q/ V
$ K# u4 T+ z. I$ V8 R/ }
//TURBO C 3.03 S8 G7 [7 S5 _4 w
#include <Stdio.h>
/ G) K, ^5 E4 H8 G, ?  P4 @* ~5 @  a#include <stdlib.h>- s+ m. P5 b, r, t
void main(){
3 |" d  _9 `' u9 {3 K% |* UFILE * codefile;" s, j0 t; d! j3 c/ k
int I,j,k;
! v, }% J, i' ~2 e6 icodefile=fopen("table.txt","w b");$ k: y# D0 B, N" p% ^, x
for (i=0xa1;i<=0xfe;I ){
# C& T( a, k( p  H7 U' q8 w* @for(j=0x00;j<=0xff;j ){! G9 w! E! v% r; p
fwrite(& I,1,1,codefile);
; j. g5 u6 t' P( k0 Ffwrite(& j,1,1,codefile);}5 l- k' s) f) y7 @, F- n
}
. S2 j9 w) H5 d, n" \fclose(codefile);: E4 i0 ]% H6 P! Q
return;
- u5 M3 m# F9 ~) [% {* l, m/ _}
1 b  W, k4 Z  Y! L  o! |$ h' @  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。* X$ }/ I0 A, i

) e- L2 l' n! v: d8 y
+ Q- j; Z& N7 g0 D第二步 转换
+ ^- [. j: p5 h. O8 C1 B  H' Y
1 s3 Z3 u  O) ?9 x! K: Y// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
6 ~7 T1 k) s# t$ m! |5 m  下面的源程序,将BIG5码文件转换为GB码文件。& N* X8 D- Z8 |3 f# C  s
' \9 h- A) i- Q$ A, l- F
//TURBO C 3.09 w1 E" K5 B. S. I# K' k
#include <stdio.h>
" T2 N! K$ n" z0 H, {5 e9 c# o, j#include <stdlib.h>
8 b0 Q/ e/ c0 ^7 ?! R" h4 Zvoid main(){: i! N: Q6 L$ p# R% k
int que, wei;
5 a% B8 |2 J3 Y+ l' c, rFILE * sourcefile;4 A! w9 K2 C2 L6 ]7 D2 H+ h
FILE * tabfile;, r* B" u1 C: s0 m- C
FILE * destfile;- W9 N* ~2 s8 \; t+ @
sourcefile = fopen("big.txt', "r b");
  [+ I" X2 H( s: X7 m$ H  M4 a//BIG5 码文件' U& A( z4 e0 L% k
tabfile = fopen("table.txt", 'r b");, @7 }! k4 C/ S. L6 D9 X1 D
//码表文件
3 t9 f1 O+ z% u4 _9 hdestfile = fopen("gb.txt","w b");
% H# x% F/ K2 u//转换生成的GB码文件
' Q% a8 e+ J- h& t, p! }: {while (!feof(sourcefile)){# [  Q$ J3 {+ f, S+ M& \% J2 Q
fread(& que,1,1,sourcefile);
9 I6 X7 Z+ I$ f! I4 S) O* D4 {7 Hif (feof(sourcefile)){; f# n0 E" Z' g5 j2 {! ?4 p
break; }
2 t  y+ j1 |- v' F* O. p* }& X' Qif (que> =0xa1 && que <=0xfe)
4 P5 r+ s8 ]! I3 G6 g8 C" G0 o- P//叛断是否汉字(BIG5编码)
5 c* c0 U& D' q1 _' L! {0 D{fread(& wei,1,1,sourcefile);: f7 A) \) [. j5 A+ x
if (wei<0xa1) wei = wei - 0x40;" i+ J- g5 H; X0 ^
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
5 v& s' |8 i1 H' e( \4 Hfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
' N- r, k3 o) M4 qfread(& que,1,1,tabfile);% Z9 ?3 c4 V; k0 a
fread(& wei,1,1,tabfile);
& A$ `1 R/ F  M* qfwrite(& que,1,1,destfile);
' I- ^# F* j$ s* l9 xfwrite(& wei,1,1,destfile);
8 g6 l; A- d3 o% A7 R1 {}2 w. p/ Q7 R! I3 I
else
0 N( W1 m' o$ l) c3 R) N2 `4 c/ kfwrite(& que,1,1,destfile); //处理英文
0 U9 i8 s9 K; `6 I/ e+ C  }4 F}
* @4 H! B. p2 r& K# g7 S$ Ifclose(sourcefile);
5 V. p# U9 P' |fclose(tabfile);: [' o- n$ J  n# I* t$ c* ^) L3 c
fclose(destfile);
. W$ |6 V6 C' T$ e+ ?2 |. ureturn;+ a, E6 y* [. I8 m0 I1 Q
}6 h( e, R# x1 {0 M3 x
* s! c; C$ f  J( e( d
  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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