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

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

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

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

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

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

BIG5码到GB码转换技术  7 `# J) D" P& ?/ F
一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
. }, ]) P/ ^( {, |' K. f3 k, d9 p6 z; G* f& B' F& ~- g: u
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。1 p+ B: @# V, b: X
/ t8 x0 d# `) J, s0 @
第一步 制作码表文件1 _0 Z5 J6 ]2 R9 |. h
0 q' O. x* B3 t; [7 G% W% T! {
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
" i& H9 @; G5 f# a% _0 z  V6 b制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
0 `- M8 @; R  |% p) l
  F: _7 }  J/ ]) i7 U   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
" z3 V) g, a$ m# P" W5 J5 {+ _+ t5 u9 B3 w) x0 G
//TURBO C 3.02 \' V/ t5 T4 @" a9 g( @2 A
#include <Stdio.h>2 \8 }" _) ]7 `
#include <stdlib.h>
, J: ]6 S: z3 f: G1 T1 L  J6 Kvoid main(){% q+ ~$ ^2 B% y$ Y; C6 W2 P6 q, j
FILE * codefile;
$ B; Q" v, b  Y$ F+ {9 pint I,j,k;- ^$ S) d" S" V
codefile=fopen("table.txt","w b");% N( V8 |3 P. o
for (i=0xa1;i<=0xfe;I ){/ [" Y6 Q/ C" x' R
for(j=0x00;j<=0xff;j ){
$ u1 P1 O/ U: P2 Y" ]' }% Zfwrite(& I,1,1,codefile);
5 X- U# N; J6 Q4 B3 \& s4 ]fwrite(& j,1,1,codefile);}: N7 z! Y7 d& i2 M5 @$ k% z
}/ L& N% ^3 Z% W: N! s- W
fclose(codefile);0 d" ?+ l5 N# }6 }8 {" h) @
return;
! d1 A, i' J, O$ k3 d}+ z1 m" d, S  i1 R
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。$ ~: w1 K/ w. r2 N/ W& M; }% `
6 ?$ Y0 _, g2 J0 j

0 ?- M6 d. I$ V5 z第二步 转换( H! [0 W2 _( L9 a& o& K; h- l0 v
3 b4 Q( H# v# o
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd8 G3 E. S7 `0 q* k6 t6 d0 Z8 W
  下面的源程序,将BIG5码文件转换为GB码文件。
# H, b/ v2 J, l  j2 e
- V( I: v' K. O( R) o) c7 m  m//TURBO C 3.08 c9 M' b" O$ [5 w3 F1 u9 U! }- L
#include <stdio.h>
9 |) n& m, u' k$ Y1 V/ F# j! y#include <stdlib.h>
  F* O9 M  R" a; E1 zvoid main(){& M0 y! ?  W0 N( `( e# |  j
int que, wei;1 A0 j. c& N& w3 m! ]. F4 c% h" d
FILE * sourcefile;
: p. `! Y! N$ RFILE * tabfile;
+ F# G6 s" N5 _) k- n% EFILE * destfile;1 }- ~7 s) I0 l4 E8 c
sourcefile = fopen("big.txt', "r b");
& ]# ?( L6 @, \! c- c3 E$ A: Q! G0 v//BIG5 码文件
& t( d* O( X! H& T9 C7 v7 ], y) stabfile = fopen("table.txt", 'r b");3 ~0 k5 H  P  B- Z
//码表文件: w% X  t+ ~  g9 H
destfile = fopen("gb.txt","w b");" ^5 [! C& s5 X+ `) S  C
//转换生成的GB码文件
$ ]& y5 d; O! v% x5 l2 mwhile (!feof(sourcefile)){4 j' M# ], d! X
fread(& que,1,1,sourcefile);+ c* m) r7 a( P# ]) C# S: c" F2 ]
if (feof(sourcefile)){2 d, J9 h7 H) `& c7 d
break; }
+ `3 T- [" U" a. V, Jif (que> =0xa1 && que <=0xfe)9 e0 d) [) j3 c- n
//叛断是否汉字(BIG5编码)7 `% W& H1 ~5 O# e2 t, R
{fread(& wei,1,1,sourcefile);
6 d/ F; G) i* T: v- eif (wei<0xa1) wei = wei - 0x40;% G6 E7 T$ \  B9 X
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;1 v" }; B5 h2 A+ z6 H, f" G# Y
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);, b2 m' v' q% Y- `/ B
fread(& que,1,1,tabfile);3 u$ s* f5 E; a/ L
fread(& wei,1,1,tabfile);& n, ~8 h3 A; U' f, e8 M
fwrite(& que,1,1,destfile);! {% s5 h$ D( }4 w% i' D' H
fwrite(& wei,1,1,destfile);
1 U( [. I1 R& B2 @0 ~}
/ S. Q9 p. D" ?1 a7 v: ]2 ~else
/ m* J5 j1 Q- H- _0 M# D8 Ufwrite(& que,1,1,destfile); //处理英文
2 K! t( H0 C$ a+ E$ n4 d4 {2 P' G}
( c& l: k5 O$ K. A- i  X/ d4 Ofclose(sourcefile);
1 q0 i$ d5 U8 e1 R! Zfclose(tabfile);
& J& @( A8 o  d/ Jfclose(destfile);
0 Q5 F! j6 Q6 I' I7 wreturn;
7 q1 W: A! [9 t3 Z1 `$ c) r}. w3 S% r2 A' P4 s

# i5 G! c1 v; U# e9 X  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。% Q9 g. `5 {* ?% F; I  ]

# K7 V% q/ e. S# c+ V# d+ K: s  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
# `9 i! Q  e% B& x3 b& @2 X7 e$ M' J- B. _* T3 e
第一步 制作码表文件
  Y$ H4 b- O% X( g8 W! ^
5 Z, j( E1 v5 |  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。6 l4 y( o. J, X
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。% ^' J& q" ?3 A  o' l, e/ C
( t, X/ _4 L/ U& l2 P
   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
9 @* I! N# \' O$ [) r
4 l8 j& K8 g, e, _4 k//TURBO C 3.0
3 A9 [8 ~) J2 M/ k! V3 h# v8 }: s#include <Stdio.h>
+ G. y/ o) Z$ b" y$ u5 e3 l#include <stdlib.h>
: w2 U6 h2 c0 k& C  }* uvoid main(){
+ d4 j5 u$ t# }  h$ [3 {FILE * codefile;8 \; u+ C  Z7 P1 u
int I,j,k;! a# i/ m# a  j5 ], ^. K
codefile=fopen("table.txt","w b");! {3 z" G) |; ?% i7 H" |
for (i=0xa1;i<=0xfe;I ){9 d( ~# L/ k9 [5 I! `
for(j=0x00;j<=0xff;j ){
$ F5 n. {" o! A, Ufwrite(& I,1,1,codefile);
* r# c2 b: _  cfwrite(& j,1,1,codefile);}0 c' z# D- a/ K3 ]: ^
}
- N! J0 }3 e4 yfclose(codefile);
* h$ c9 w9 ^% S6 g2 s# u' O) J0 Lreturn;# }6 ^7 p: B' A  d1 N, b
}  e$ o( Q4 k- {5 S- Q( O6 @8 u+ V
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
+ }+ G2 S/ |' h& d8 W; e7 b8 \) ]; |+ }4 U
" Q: D# X- ~, v7 X& y
第二步 转换  o; K; }( A, [8 Z! {. ^0 q
7 Y4 I3 a! \# ]6 e- P
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd5 v5 f2 Y" r5 V3 g. e! |
  下面的源程序,将BIG5码文件转换为GB码文件。+ w6 Q. J1 O# e' K) T
, T; I2 }# E' l
//TURBO C 3.08 ^9 P) I6 ?4 r4 @3 ]$ S4 ?5 e- }) a
#include <stdio.h>7 B6 _" p# c! r1 G+ c9 m+ P
#include <stdlib.h>
/ M) ?- C5 ?! Nvoid main(){- \# {  M* t, |: V* C4 d( }
int que, wei;
# k5 Z2 e4 n4 F8 y% dFILE * sourcefile;
( c* Q( D; v) G! EFILE * tabfile;+ I% a( _0 ?1 b: D9 e% U" h
FILE * destfile;# M6 N: m8 n6 x. ]6 N
sourcefile = fopen("big.txt', "r b");
9 K% a3 b- H$ r! G//BIG5 码文件
2 T0 i1 U" V& Y7 L4 r  Ptabfile = fopen("table.txt", 'r b");5 P+ `- B* b$ v$ r* ]2 \
//码表文件. e9 Z4 ~5 z) I2 v0 D( [
destfile = fopen("gb.txt","w b");: o. j0 h& O0 q8 i( O
//转换生成的GB码文件: V, C& {  N; a+ H. ~
while (!feof(sourcefile)){
1 x+ N4 A. m: p& dfread(& que,1,1,sourcefile);
' c/ ^8 s- h9 x+ E3 eif (feof(sourcefile)){& g, f& E5 m9 p6 E* H1 _& K
break; }
0 ~8 R. O1 n5 n( u' c% v; z1 Yif (que> =0xa1 && que <=0xfe)
! l0 n  _6 b" h( G+ y: S//叛断是否汉字(BIG5编码)2 s( {" t* H1 {  V
{fread(& wei,1,1,sourcefile);6 l5 C: q1 V7 n4 D
if (wei<0xa1) wei = wei - 0x40;
4 l* v" z0 P6 _% b2 r% W  rif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;! ]5 |4 B  y$ A5 u$ |/ f0 Y
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
  [( J8 V: [8 Ffread(& que,1,1,tabfile);  Q/ ^) `9 H# F% M4 q8 E$ }
fread(& wei,1,1,tabfile);! J  K1 L9 G# s9 N. r' `2 J4 s
fwrite(& que,1,1,destfile);! G$ p' F1 \* C1 `4 u2 Y- v
fwrite(& wei,1,1,destfile);
2 u: `' D2 e1 P; C4 j9 k1 R: E}6 h1 l9 Z  O! {- C: |
else: B) s2 Q. i( u1 O
fwrite(& que,1,1,destfile); //处理英文- w$ c7 o3 |- f! n
}
2 |% Q! H0 J* {0 r! Q# afclose(sourcefile);
3 C3 b& J: j2 zfclose(tabfile);* i& v8 [% {& V: l$ K! {0 u
fclose(destfile);
" n( i2 k7 H3 c5 I$ N9 d1 }) X6 o  lreturn;" D9 G8 b0 X% |3 _7 N+ f. \
}
. f/ H: P2 I9 Z9 z$ e; Q+ C- o$ ^1 x( U+ T' i/ \; L
  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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