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

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

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

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

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

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

BIG5码到GB码转换技术  
9 L! K" Y- k+ P一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。2 I; F& x  L- T/ u2 s" F5 X

1 f2 @4 e7 g. E% d, g% r  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
& ?! Y$ y# S, z; N+ u9 D' [! X  ~/ F9 ]0 k7 r" c+ P! D
第一步 制作码表文件( S/ N$ H3 b% _9 a  _5 t3 d

5 K0 F. {* y8 ?. t( O  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。. n+ H" \! _/ n; k. R- X
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。0 x: g5 p( S" l' R* y

  G1 E# j: C" z9 h. e- l! w   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。, ~  `( P1 Q& A! o  f

$ B5 ]3 @8 i+ o; m! i4 u; G% w//TURBO C 3.0
4 d. O5 m- W( P- b3 F' M#include <Stdio.h>
$ q: w; f6 Z. M5 \( k6 a#include <stdlib.h>
' o. x4 A' D: u& J( c+ V' w* o" ]void main(){
  M( G: y4 a3 f6 XFILE * codefile;$ a( Q+ q& [3 u  Y  P1 o. V
int I,j,k;
" q' p4 S  m$ V) S, N  zcodefile=fopen("table.txt","w b");) \! j4 J3 D% ^+ A3 q
for (i=0xa1;i<=0xfe;I ){  |: c) p' K+ B8 E0 w( \. e6 ^3 L
for(j=0x00;j<=0xff;j ){
) }; F3 a) V2 q2 r5 R9 afwrite(& I,1,1,codefile);7 u0 W( |. Q' }
fwrite(& j,1,1,codefile);}9 p" o6 D9 {* }$ x* t' R
}, G: q+ b6 g+ Z  ^7 P" z
fclose(codefile);
, ]* C/ U' r. ~# A1 T) ?' wreturn;
- k1 f& m8 o. _# Z1 t1 n8 w2 Y}, b0 L) a$ U+ X" h9 [' T: B
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。6 B, R2 y0 v" I* ?8 {
  t# `; e$ v! S! w# N
- Z$ q1 {9 r) T. R& p
第二步 转换
: Q+ `7 M9 X7 `1 Q7 I, n8 X* g: A# m# N9 O1 B- ^2 r" w
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
( ^8 D9 F: ~) g, m0 y( \8 _  下面的源程序,将BIG5码文件转换为GB码文件。4 q) u  J- S+ R" Q. U

& f: M9 g# K) w3 v% p0 ]2 l" h//TURBO C 3.0% [/ S  N7 `; k0 P
#include <stdio.h>! V6 y3 N* O8 S- c1 w
#include <stdlib.h>
- x/ L. `4 E. D) }$ b$ Uvoid main(){
$ G& q1 ~. C0 ?4 ]' L" h3 U! aint que, wei;4 ^& N# S* m4 X0 X, F  Z
FILE * sourcefile;
' N2 L1 W' B1 B" Q) |6 l8 S- bFILE * tabfile;
6 u6 O# h) o2 E' H1 {5 kFILE * destfile;
& T# x- L# `4 @8 ^% l+ Ssourcefile = fopen("big.txt', "r b");/ j7 @0 ?) Q/ j9 q$ `% e
//BIG5 码文件" F$ ~9 S0 q2 J9 o( G
tabfile = fopen("table.txt", 'r b");% W4 Y) d6 D& R8 K3 G
//码表文件
  s9 g$ s/ |! E1 }4 R+ n9 G1 ]2 b  edestfile = fopen("gb.txt","w b");8 }8 f* R5 J' A- U4 u& c- v$ @
//转换生成的GB码文件& R( I6 b" Y; e' k9 ]9 q% O
while (!feof(sourcefile)){
8 O) N8 n9 n$ c  Qfread(& que,1,1,sourcefile);9 Q4 Y4 S0 u- V) D0 p8 c# Q
if (feof(sourcefile)){, k! h  |* P: h/ N1 L
break; }2 N. c) @1 C2 w4 S$ C3 [
if (que> =0xa1 && que <=0xfe)! p: X3 }6 _! K, X) O4 m
//叛断是否汉字(BIG5编码)
! z6 U- j$ m0 U4 g7 P0 Y0 _# _{fread(& wei,1,1,sourcefile);, w; @) f# z$ f5 ^8 R0 j# k7 Q
if (wei<0xa1) wei = wei - 0x40;
" l! Y1 r1 W" |6 c- b8 C6 j* M: Vif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;$ P  q0 Z9 f) Y& z4 J
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
0 ^9 D: I- z% w: J* P+ m6 S/ ]+ Sfread(& que,1,1,tabfile);
  N3 y7 b; _) Q/ {0 @+ s( c* Q1 d4 Gfread(& wei,1,1,tabfile);4 k( C5 a, Q* @8 c1 }
fwrite(& que,1,1,destfile);
+ H5 d& d5 c& m2 [" Lfwrite(& wei,1,1,destfile);  S4 B  `3 U  A
}: [- \3 U/ j( N7 u# x
else
# S2 w) s$ B" f% W" Y1 [5 mfwrite(& que,1,1,destfile); //处理英文
( \, a7 n9 b+ j( H2 m3 s. o}/ ]0 z2 U+ V! X- V
fclose(sourcefile);
# |# \6 M1 F1 D- ?+ @' d' f3 Jfclose(tabfile);0 \& k0 N: w  J0 \
fclose(destfile);% B' z5 ~/ l* ^4 i. L; L& ~
return;
6 I4 ^3 |; G) |8 r$ Z$ M5 U& s) {}
! n1 @4 t# L5 \2 ~- S2 i, h
9 \+ c7 W7 G" O2 |: \  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。! K. F1 p9 Q, s- U, ], o, ?

; _2 m2 _$ m' O' x* C0 I9 a  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
8 s" x5 t5 {+ J# ?1 W. y& h9 L$ S. b# K% N: I! x: d3 U& d: T
第一步 制作码表文件
* l; k+ o1 F- \) a. s' U
' d# g) o& x/ J# B% f+ i  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。" @& Z; B9 S- m3 B( E* }
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。8 X8 Y0 g6 w2 o' Q% p+ p

2 J( J6 _1 @) D- ^# ?! O; X  E4 q   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。( t, a4 S+ g) _0 G2 c# j: B

( }7 X. E3 n  {4 D5 r4 }. x# h2 }; _//TURBO C 3.0
+ h# {( E1 u! n- U#include <Stdio.h>8 |; ~3 O, f! X! b- Y
#include <stdlib.h>
1 \! S( c* N% qvoid main(){! |* t9 T6 @' y4 b! H. {
FILE * codefile;, C. Z8 l' I0 Z0 y# C6 t0 p) _
int I,j,k;3 v( c% N+ W% o8 Q
codefile=fopen("table.txt","w b");) `/ M' c& n) \1 l/ V  ]
for (i=0xa1;i<=0xfe;I ){' s  b% a1 Y3 L8 P5 l
for(j=0x00;j<=0xff;j ){
4 [* A  e0 b+ n1 s% Q1 @fwrite(& I,1,1,codefile);6 }. q6 w' l( A. e+ y9 r
fwrite(& j,1,1,codefile);}
! X4 b" k) I2 [2 [  B# g3 w$ c}: C. p' |( J; O% q- v
fclose(codefile);
  L( b! g' _% E, I, @return;
6 ^2 c6 ]- `& w( \* s+ v7 T}3 Y( b  A# y# t% C
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。( M' J. g9 u+ r8 A1 L6 z
" }$ n* D7 a3 k2 ?

; c/ C. b- D  A8 k$ J第二步 转换
/ {! D% E" h  }5 m) p  e1 N
- g# ~$ f1 |3 p) _& V# F// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
5 ]' w+ \3 Y9 }% f+ \" C% U. d  下面的源程序,将BIG5码文件转换为GB码文件。4 u# N) P# c9 {* Z+ a

5 l7 L: u  H% \- p, C/ }//TURBO C 3.0  j$ ?1 ?) G" J" F& u1 M0 s
#include <stdio.h>$ d/ `# a/ I* E. k/ D; i3 l2 O; v: A7 R
#include <stdlib.h>
( s! N$ W# i4 }; _* L0 dvoid main(){% ]) U  a7 H6 _9 m* R  R. ~: D
int que, wei;/ v7 b  }0 I- {9 D% r4 u
FILE * sourcefile;
; \0 k' {+ T" j8 A6 eFILE * tabfile;
; M' x! ]# I4 n# ~! w' S& YFILE * destfile;
/ z+ O* w& [* I- g5 V. ]6 tsourcefile = fopen("big.txt', "r b");: O) z! P. Q" x# R% U1 R+ }; `
//BIG5 码文件
0 g- H2 x7 J3 D# htabfile = fopen("table.txt", 'r b");
7 F  R! W3 u1 J- E- e; W! T, g//码表文件9 }" t' w3 M, |6 J0 [6 A
destfile = fopen("gb.txt","w b");
" M1 N! H! f5 {0 ?- X1 |9 R//转换生成的GB码文件( o! i6 W+ h6 w8 B- w; d# X
while (!feof(sourcefile)){! T- U( d: X& `  G# V# O$ h8 o
fread(& que,1,1,sourcefile);8 `1 q4 `/ b8 p6 N# M1 D5 P
if (feof(sourcefile)){$ e5 ]" l+ `& x" m% D: \! @
break; }: U! i' P8 s( H1 O' w
if (que> =0xa1 && que <=0xfe)
& b2 |8 G; H) Q7 y. c8 ?//叛断是否汉字(BIG5编码)4 |5 t' S5 M" a; d; S
{fread(& wei,1,1,sourcefile);. ]$ \3 o9 e. a" X. z8 D
if (wei<0xa1) wei = wei - 0x40;
) a$ G  R& d: c3 Z& D1 S7 u: Nif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
9 f- P. `; Q: ]8 N0 F% Bfseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);' C( w; ?  |& K. r5 M' U. `* W
fread(& que,1,1,tabfile);
3 v( o5 x5 U# o9 dfread(& wei,1,1,tabfile);- S0 d0 c- D+ @6 G3 n3 |5 ?
fwrite(& que,1,1,destfile);* o$ V, Q" I: p" E
fwrite(& wei,1,1,destfile);  I2 r' e! \/ q' y) O0 A
}
% H+ [$ P# \$ Y6 @. C, Selse
* V% W& G! F% ^# U+ x. ~fwrite(& que,1,1,destfile); //处理英文
. s2 ^& M+ F; _$ K0 b- T. x}
" n' A- z- [! E! q; r, yfclose(sourcefile);
' x0 O( v' g8 K$ l- y. N' b% @fclose(tabfile);
( I5 |: \8 P/ b( }: u- l, ^fclose(destfile);
$ a. I# h7 Q! k. w: w% c6 ^. ereturn;/ u% a4 B7 S. J; l# j" s* a' b
}' v. p! Z$ {: h, w7 B2 O' R* t
8 ]( K6 a  k9 S$ ]8 m
  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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