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

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

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

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

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

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

BIG5码到GB码转换技术  
9 M( q7 }7 z+ J6 Z! {一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
& J3 X& j( ]( g* l3 N2 P
; N2 d# Z0 B% t0 Z  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。$ N* l. n8 g8 V* E  t0 a  P+ b. h: y
* h% z# \1 j) w" }+ M/ |
第一步 制作码表文件
& a  E3 ^0 B2 g. V- P
: M, U* ?) i* N  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。3 _2 C6 a6 V2 s4 ~& b9 w6 l- j9 }! k
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。" L2 X6 _2 {8 j

* \% S' h4 v" x; f* Y3 k   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。5 Q/ I# x  `9 y1 O+ u) b: j
1 c( ^) h+ o0 T% t( m. J
//TURBO C 3.0
& L; q9 [) r6 T- c* D#include <Stdio.h>
# g& l/ r  u$ G#include <stdlib.h># y. {; G1 o" [+ N1 _0 R7 K
void main(){$ M* E! k" n- O, m4 {& g
FILE * codefile;" O; J* U9 ]" Q# r) Q
int I,j,k;
* S+ ~. W2 g1 E( _& tcodefile=fopen("table.txt","w b");
- }1 }. ]% A3 X- Q- afor (i=0xa1;i<=0xfe;I ){9 j; J3 P5 r' W7 x' i  P* Q; `
for(j=0x00;j<=0xff;j ){! G1 D8 D. f/ r
fwrite(& I,1,1,codefile);- C$ l4 p) p7 q7 u6 x
fwrite(& j,1,1,codefile);}
) Q' C. m# V1 W8 P3 b2 o}) L  F2 x  g: O  S  G; V
fclose(codefile);9 W3 @" A( t2 u( [$ H* L4 W
return;& I% J$ @/ _7 B, ~2 ]) x
}1 e/ \, a: E7 ^8 f# b
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。8 }- i( k4 j2 ?* d. L" ^* n' a
+ A3 |: c. O5 G) N! |" S- M& ^

5 |/ G( B$ x% c  E+ Q第二步 转换
' V0 i1 n- t" B+ U* W6 H+ q5 t+ ]! h  O& E# U4 [2 m& ~+ R' L' Z
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
7 |- Q8 m7 I/ g: P9 X' y' r  下面的源程序,将BIG5码文件转换为GB码文件。, f& D9 ]* p% W7 B2 G/ x( Q
5 j- h: w' A, C& y( E8 |# s9 u
//TURBO C 3.0
' P0 I* `8 G' v5 e% k5 V# Y: I#include <stdio.h># ^# m2 ?/ b3 ^4 R
#include <stdlib.h>6 r+ h+ w, ]- j# r. C; H( S
void main(){
- b* d2 W' J, P: ?) jint que, wei;
2 w9 {' E5 j# P7 ?1 @6 M" gFILE * sourcefile;5 q4 L: k7 \8 H) G
FILE * tabfile;/ D, N5 L' S5 e0 B
FILE * destfile;
# N2 B5 l  C# W& n' M% nsourcefile = fopen("big.txt', "r b");
  F) a# h; A7 `9 @//BIG5 码文件
& o" l, G8 y( wtabfile = fopen("table.txt", 'r b");. ?* N7 }# M% X0 U5 ^3 Q
//码表文件
+ i* b% n. G7 {1 _! w+ vdestfile = fopen("gb.txt","w b");7 ]5 v) T' M2 r7 r$ [5 `2 i7 l  C
//转换生成的GB码文件
0 |: u8 b4 B1 g( a+ h& z: ]9 bwhile (!feof(sourcefile)){( f" \0 k' V: {) ~) [& b. c0 ~
fread(& que,1,1,sourcefile);
7 {2 F* `: I6 aif (feof(sourcefile)){
! n/ X  M, X' Q* Q' e7 X$ rbreak; }
! U4 I" b& F% O3 A/ w; Qif (que> =0xa1 && que <=0xfe)0 i; g$ e3 h* N: `
//叛断是否汉字(BIG5编码)
& D; \+ }6 [- Y% E' i8 a, {3 X{fread(& wei,1,1,sourcefile);3 O0 T) J- _* q7 q
if (wei<0xa1) wei = wei - 0x40;8 H- F) W6 z8 v: i: ~: E
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;
3 g0 k% o( Q9 ?fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);8 q: _- _( f  _8 G# z" c
fread(& que,1,1,tabfile);
: d& h# O# s4 I1 cfread(& wei,1,1,tabfile);/ _5 D; V( p  e. k9 `0 v
fwrite(& que,1,1,destfile);
3 K- [/ \; Q2 P# [9 E; p+ zfwrite(& wei,1,1,destfile);( Q, i2 r1 D( I0 Q: C* ]- ^
}. m; W7 W5 t5 @! T; p5 J  Q
else9 P7 [1 g. R) M) c
fwrite(& que,1,1,destfile); //处理英文
/ M9 f; V! W2 B" O# W' j}& W9 b) c& m3 ^- o8 S; L6 h1 x: D
fclose(sourcefile);
# I  |2 z* w5 p) \' Kfclose(tabfile);
4 n" J7 b  }3 U: l0 J: e" Mfclose(destfile);
. P* C' Q% L0 q9 L# g8 nreturn;+ @' K& b( _' L8 _  W) v; g& `
}
  N7 t4 h& ~# ~/ m9 v* J5 H/ y- E8 N! U; Y5 T1 I9 `$ V) j5 p
  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。* R5 E: ~" u1 \7 `3 O1 O
; Z( H  o. U  q- t- K, `, _4 l9 T  l
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
  K" b9 V2 \% I* s- O0 |' y, m1 f2 L
第一步 制作码表文件
  |( s2 _6 @/ Z* z* ^( [
/ S; @" G/ d' w2 A# o3 f5 a- k0 v  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。2 `8 R9 q9 i2 Y3 h
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。- |- e9 w7 D) n) H
8 Q3 H! L0 t) g; G3 Y
   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
# `! _( A  I& w; W
6 _, z4 {. c. e8 o  I//TURBO C 3.01 N: f  w2 X, v( g! A
#include <Stdio.h>
5 r9 U0 f$ L) [! f9 J+ A* c# U#include <stdlib.h>
( l! D" b5 g( {% cvoid main(){, C- T& E1 n) [4 M) o5 h
FILE * codefile;
. I# ~  N9 V4 @$ `5 {& gint I,j,k;
; K& y8 P% w7 {codefile=fopen("table.txt","w b");) U/ m5 d2 e$ j$ N$ g
for (i=0xa1;i<=0xfe;I ){
6 {6 l7 V3 [( A1 Ufor(j=0x00;j<=0xff;j ){
+ b$ c" o' l4 N  |* @9 Xfwrite(& I,1,1,codefile);
) ~4 x: x8 \7 h0 O, O! Afwrite(& j,1,1,codefile);}. ]! q0 `, {6 E6 Z: h# e
}
. ^& H( m7 N8 cfclose(codefile);! X$ q  x+ w1 i& D% B9 S& p
return;
8 b0 l4 p0 h) v4 s. G1 k}5 C0 U- k4 f$ }$ L7 \/ }+ j8 @1 p: z
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
1 ?1 q3 Z% S: F8 V2 N1 q( Y- E3 J2 W: W# P' s
; ^8 H8 _5 y' e9 H
第二步 转换
2 w, t; _$ T. Q3 `$ l5 z$ [( w+ F9 g: ~6 C  T( }3 S
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
, p4 G$ G! Q5 [3 d1 e  下面的源程序,将BIG5码文件转换为GB码文件。9 |% L" s! j. L6 @- W! K/ J
: c' L& i/ F5 g8 Q5 Z+ d
//TURBO C 3.0
; X: u4 G. A  U; d5 B# D  ~#include <stdio.h>- G2 w& V9 B( d* O* w0 Z
#include <stdlib.h>
* v! p7 C3 M% ?, f3 h; Lvoid main(){
- l  Z5 ?3 g3 {/ Y9 j- v1 u5 lint que, wei;
# R7 g& w/ ?6 B( ~5 n, `FILE * sourcefile;
9 i9 u5 D& C: R. u) u8 ~; Y) ]" {FILE * tabfile;  \7 |, i3 q1 t# ^
FILE * destfile;
0 x0 N5 O: m5 `sourcefile = fopen("big.txt', "r b");
! C. n, x  M- x8 k* @; a//BIG5 码文件
+ h! ]8 z7 b& Xtabfile = fopen("table.txt", 'r b");. f' [8 T3 w- b: J8 ?
//码表文件/ d/ y- [8 t, x' D0 f$ Y  L; P8 f
destfile = fopen("gb.txt","w b");0 J& q2 l( U* {! t  t3 ~0 M# B( S
//转换生成的GB码文件# I" N2 \9 H/ U- Z
while (!feof(sourcefile)){# F9 G/ I& J" H) R- H4 ]9 z
fread(& que,1,1,sourcefile);$ G6 D3 Z+ E7 O$ W% j
if (feof(sourcefile)){
3 D4 q9 Q$ t& M5 C% Hbreak; }
% x7 w) Y" N" _, v1 ~' b! i8 qif (que> =0xa1 && que <=0xfe)
) l: |, k, v8 z5 {' x0 I//叛断是否汉字(BIG5编码)0 l9 O% G4 U% W9 X. t$ C
{fread(& wei,1,1,sourcefile);
, W' F7 r, i6 r  Pif (wei<0xa1) wei = wei - 0x40;
, w2 L& ~/ O/ bif (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;5 S; R% g+ m8 H5 X9 v- e/ C, {  U
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);# i, k4 K; b" L; d8 B; ~; h0 w
fread(& que,1,1,tabfile);
5 P7 D+ o4 C" Z! S0 x7 |1 }fread(& wei,1,1,tabfile);6 w7 ?+ Q! B3 J
fwrite(& que,1,1,destfile);
- c- s: [8 d% u) @/ R2 Y/ j$ lfwrite(& wei,1,1,destfile);+ [' h, i! {+ [( \, W9 `
}
2 R: P. ~4 f% nelse
  y9 R/ d" \6 wfwrite(& que,1,1,destfile); //处理英文
+ m* G' l6 [+ K0 F}: H& _) F; t8 u! i
fclose(sourcefile);
' b6 K; A  Y( B) A  I+ M7 gfclose(tabfile);
, C$ F% l6 Q* {! a4 i9 Ffclose(destfile);
5 l& e/ v' K- x% ~7 Y: [( {  _& Xreturn;
, G8 P2 C  F' h9 N}3 ~$ k$ s: x* f/ y1 }7 k

8 i. B6 }; ^8 ]% I8 l7 |3 H  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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