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

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

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

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

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

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

BIG5码到GB码转换技术  % p% _. G- q3 B* Q
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
/ e; q: W2 M4 P) I3 P, O4 b6 C$ E4 C
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
+ T0 G% \  ?; M) @; S
# F0 O* f5 g8 _/ E9 d( F4 Y第一步 制作码表文件
1 ?8 \, m: ~5 ~
4 u, y: H* J2 V, }  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。$ z% N0 M. ~* Y9 {, B  W, C
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
/ ^0 e; i$ W+ l6 k, S  b+ N* J
; O2 [& H- t6 P  r) _   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。; U8 K5 C% t! g$ g* Q. e
& b" q; h1 X2 N/ M8 d' ^# \0 E
//TURBO C 3.0
& B; [! E% A, S2 x* o, e8 v#include <Stdio.h>
$ r9 G! f" g0 _; N( X6 }#include <stdlib.h>( g) @! P5 E1 R' i6 w$ F
void main(){
* U5 `3 R; _3 hFILE * codefile;
2 `$ i9 Z' c* V; B0 A4 xint I,j,k;9 t6 f+ w! I' Q: ]) d
codefile=fopen("table.txt","w b");1 g$ R1 T. L* l' R3 ~& j
for (i=0xa1;i<=0xfe;I ){! w5 e; m, G$ s/ W: q( {( _
for(j=0x00;j<=0xff;j ){* I- [0 q$ t5 t4 Y) e' w& W
fwrite(& I,1,1,codefile);
" \) T. X: g* Sfwrite(& j,1,1,codefile);}
# N3 T& h, b4 l" Q. Y1 j' Z, w" b- x}1 V, R8 @" e: o: a% j+ H
fclose(codefile);% F2 p+ P" D# ?: g4 U
return;
4 C) d) ^5 |6 g: D  N2 z}
  x$ A2 s  ^* z: E" h. m  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。9 _6 ]& K0 C5 i+ N" n

# j& c- ~. ?4 v+ f- ]0 R9 \1 M0 |
0 U3 U* J& _$ M( D9 p第二步 转换+ }, C- \+ B" q; R% X
$ L1 E6 ~! v7 I
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd/ |* `8 L6 I, u8 |% q3 }/ R
  下面的源程序,将BIG5码文件转换为GB码文件。1 R8 k6 I* W) ]) B3 ?8 M
# {" f& U& a/ q. n! X
//TURBO C 3.0, p7 Y4 R& e  g. }; D; V1 q1 V
#include <stdio.h>
3 l3 b4 b: {% ?& n#include <stdlib.h>) T! M' J$ u. |9 v( }, A
void main(){7 M$ G% M# e2 f) X% [/ R" W
int que, wei;. R, j2 t% \$ c! _, D
FILE * sourcefile;
; w# Y3 J5 G) d& z& ^+ `; T/ eFILE * tabfile;# S" P4 b% K6 C
FILE * destfile;6 D5 F% v3 ?, ~2 x, M
sourcefile = fopen("big.txt', "r b");6 X! q; x- t7 T% {: v
//BIG5 码文件3 c. h0 y8 [% M3 b9 z% T
tabfile = fopen("table.txt", 'r b");+ A7 P- H! `7 J
//码表文件
( Q) h2 @) W9 ]# E- H0 N- X' _4 Bdestfile = fopen("gb.txt","w b");
$ j, |% \8 `- e6 A& U& A$ p1 H//转换生成的GB码文件$ B7 p, U. P- W6 z! B
while (!feof(sourcefile)){' C6 x4 l5 |0 u' \( h6 T
fread(& que,1,1,sourcefile);
% M9 Y7 \: B8 l( e, R! Kif (feof(sourcefile)){
/ k) r6 s3 A( u( ~5 tbreak; }
. R7 c/ D5 F: G- @if (que> =0xa1 && que <=0xfe)
3 q  ?2 P: Y& a5 ^/ F3 e//叛断是否汉字(BIG5编码)2 U! R! [2 |! ?9 z  T. I# G
{fread(& wei,1,1,sourcefile);' S8 x( D: \" }( ]2 f( R, O
if (wei<0xa1) wei = wei - 0x40;
% E# s$ }/ ^5 m8 i! Kif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;- k* D* x# \: K3 J1 ~0 Y# ]2 ^
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
5 E) b- s& o8 T% `; Cfread(& que,1,1,tabfile);' w1 y' L# {* f
fread(& wei,1,1,tabfile);& s4 e& l% `' I/ F  `) Z
fwrite(& que,1,1,destfile);7 `2 I4 L% z3 k( o! C
fwrite(& wei,1,1,destfile);
. v* {" S+ L1 z- U}# S: s' O5 }' m
else/ R; ?9 J- `8 U1 d; l# N
fwrite(& que,1,1,destfile); //处理英文
6 R( g1 `  W) t# W: e7 t/ b- O8 W5 ?}
5 z6 m, u) h3 d. Nfclose(sourcefile);: \/ O* z2 H6 {; ~) v$ V& K
fclose(tabfile);
* y' j7 v8 `0 }3 x, A& b, Lfclose(destfile);. i* y) G- `1 ]6 R! o) y! h- T
return;. B# O& w7 N* y8 j5 U
}
/ \6 k4 @% {  G" g( j' @) N) U% q+ A6 e! {- |3 y2 l
  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
! z2 P: M0 j, s5 |8 d) H% F1 e- `# g% o1 E0 |, \5 H
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
: y+ a4 o0 v. I6 k) P1 W# h. [" [3 ^' d8 y* d7 e/ V# E
第一步 制作码表文件7 c/ ?( o( w# h4 o

4 P; ~/ [6 n- E( H) w  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。  K5 F# o& z2 \  K( Q* e
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。' M6 [6 f; o" [

# Z( Y8 l$ \1 f. h" w   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。- C# `* ^2 M- k# \: T

/ e# x2 U  M9 ]) E$ v: r//TURBO C 3.0
9 J8 }4 N# I5 \7 ?: r#include <Stdio.h>' o, e2 W. o. ?/ t- [( r: V5 \: \
#include <stdlib.h>
) h/ N' s3 d8 K. ^; a2 o5 z) Qvoid main(){
9 a. C+ o1 G( V$ g0 vFILE * codefile;* h0 M3 a+ [& P) N- _* `4 F
int I,j,k;
' n. x' n, _; Rcodefile=fopen("table.txt","w b");
# G# }' B8 Z' n; R' c& bfor (i=0xa1;i<=0xfe;I ){$ |. n' l) D4 _% P8 v; H# P
for(j=0x00;j<=0xff;j ){
: L- U. Z/ C" z2 F% Kfwrite(& I,1,1,codefile);
6 r! h0 S1 J3 cfwrite(& j,1,1,codefile);}
. |7 W7 P' |. Z5 i% x}: t, I8 o( F$ t' W* Q/ y, k9 G
fclose(codefile);& {4 M3 T2 s$ F0 y- z* K0 A
return;! Y6 y( E$ X/ }7 X
}
1 v  x* I) }' Q  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
4 o, ~* ?7 ^; O/ J7 l3 i" `
$ p( U  \6 N) \8 k5 [) h
6 A3 d4 N- S# z# k- [$ k6 L第二步 转换, R+ `/ O" R  f

; B/ [- E$ I# s  F5 I+ ]' k// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd: w# B7 Y/ \( ^( {$ H9 p' G
  下面的源程序,将BIG5码文件转换为GB码文件。; G- i  N+ t2 w

" r$ a/ J% W+ g( c//TURBO C 3.0
( L4 ]3 \* S# _: M. S#include <stdio.h>% f- I, q# i" F& c& r% v5 G
#include <stdlib.h>* q9 K  W( w! @
void main(){
- g% X8 C  e% U3 s& F2 s5 fint que, wei;6 j7 e, o. J: j! J
FILE * sourcefile;
' i$ ]( K$ w  n2 u6 v1 @% F$ DFILE * tabfile;4 C1 V  y& X2 _
FILE * destfile;
4 b1 E5 R- Q" n* ^# Psourcefile = fopen("big.txt', "r b");
) ~7 l9 g8 @2 s/ Y; }8 X8 g1 i//BIG5 码文件, u3 l% R$ \* [1 M2 y! {+ {# U9 W- F+ C
tabfile = fopen("table.txt", 'r b");7 `& T4 |9 |+ x/ D$ i8 a: z
//码表文件
  k% j1 |1 {& w; h/ j5 D# `destfile = fopen("gb.txt","w b");3 M3 J7 X" {5 I! c+ N' s7 d) \# j6 t
//转换生成的GB码文件) W4 _: B1 W- D3 h1 w
while (!feof(sourcefile)){
& V% m3 r2 m; K: }' {8 i8 Tfread(& que,1,1,sourcefile);
2 s( m1 p+ d' Z+ Sif (feof(sourcefile)){  g) c+ h3 f9 ?1 K: v: \( ^9 W; h* n
break; }9 W" K1 T6 E+ L0 y% C
if (que> =0xa1 && que <=0xfe)
4 _9 V' W, |1 {3 A( N//叛断是否汉字(BIG5编码)$ J" t- o9 y  ?* y/ b! J& o+ o% r- }
{fread(& wei,1,1,sourcefile);8 M2 C; y  O& A
if (wei<0xa1) wei = wei - 0x40;9 ?$ ?0 N8 R0 W2 r3 M8 e6 ?
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
' u6 u0 ^6 j& x* r4 j) gfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
6 S: P' u! h7 }* U- pfread(& que,1,1,tabfile);: d% C7 ?( Q% C1 C
fread(& wei,1,1,tabfile);: S1 s( P% z* G" N3 E" y0 @
fwrite(& que,1,1,destfile);
, k- i8 G! F: Q( P+ }! rfwrite(& wei,1,1,destfile);& v8 u) G9 X4 t3 B" W4 o
}! {" [. q0 }% |  z+ \
else
* c! ^+ R6 ?. t, ?- z2 D% Bfwrite(& que,1,1,destfile); //处理英文1 J$ C7 @0 E+ t2 z
}
) i5 D8 V" z3 ~0 V" x- ?0 C' y1 ^8 sfclose(sourcefile);& ~+ ^" Z2 p" J' s' F1 b! s
fclose(tabfile);  k. I5 N* D# X/ e& [1 Y
fclose(destfile);0 [: p  j' K  I: {/ i
return;
8 R8 A$ L3 E# r+ H$ h0 F* R}/ [% p8 I* w' L6 F) M% T: J( e
- _2 X( i1 V" D. d$ 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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