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

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

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

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

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

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

BIG5码到GB码转换技术  
5 L& ~3 d! I9 b一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。: x+ M; f- f8 x4 T
$ A8 e% A( }$ _( w
  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。8 Z+ I9 ?" L- |- u. G4 F6 v
) c5 g2 L* w& S  h$ `0 w
第一步 制作码表文件
' w- v# p* X) y" I( ^' z  a* w% m7 J" O
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
- H5 I/ N5 z  w制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
) y0 K5 e4 n! H( n3 s5 f
) p* w; M! v% V# J2 u$ ~! x. l/ K! F  Y( @   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。' m5 C" O+ r6 d

# |' ?+ K+ V% v/ l: X//TURBO C 3.03 V0 |2 y/ q; ^3 j7 W  e4 [- K4 p
#include <Stdio.h>
+ t5 G4 G7 e% E; F#include <stdlib.h>, \3 J' v1 t4 Z. j% X& a
void main(){( ^4 h' q0 i& L& Q; ~+ ^
FILE * codefile;
( S0 g4 Y5 n8 Yint I,j,k;
2 N! F# q$ \% [+ ^  Icodefile=fopen("table.txt","w b");; ~/ w. q3 f5 H, N" k0 T4 ]
for (i=0xa1;i<=0xfe;I ){8 \0 ~% f8 _& W; f. T2 E
for(j=0x00;j<=0xff;j ){/ L  b; q* R  J
fwrite(& I,1,1,codefile);/ q) I6 O( k; m- b' o- C. i
fwrite(& j,1,1,codefile);}7 `! r+ P8 O8 y( x
}
7 d" P  ]3 I) J1 i: Lfclose(codefile);4 B) d6 C* j$ C: q5 T& T0 Q
return;% r% M! Q: n8 l% S& q3 K2 L
}4 b/ c/ M, C' x
  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。
# J. v* |$ m% m! b6 Y3 S: \& ]5 L6 j# j
9 ?. ~% d* Z6 }) e: T2 f4 `9 s
第二步 转换
5 ]' t- D' a$ E0 ~$ ~& t$ m, x4 u! Y% J! |
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
. Q( J2 R# x3 y- j& w: q6 P/ w  下面的源程序,将BIG5码文件转换为GB码文件。3 W7 w$ ~; Q2 d0 L
% \5 U- Q( b$ S: _' h
//TURBO C 3.0
3 }) {. k4 j6 Z* P#include <stdio.h>
. ^+ \! ^( t  \6 O* g) j#include <stdlib.h>, z; w' t2 P& y& |' F, o, b
void main(){
$ I8 m5 u+ X& Dint que, wei;
2 U- ~- H% R: Z: X3 }* N" T$ RFILE * sourcefile;
+ `3 G! D. {  L* b+ H# YFILE * tabfile;
3 W3 j& }7 _; nFILE * destfile;
0 s8 ~* x0 c) D& o# \/ e' Msourcefile = fopen("big.txt', "r b");
' z6 G+ s0 b$ @2 A7 M//BIG5 码文件
# o% z6 _! _/ [0 D, j& ttabfile = fopen("table.txt", 'r b");
" n" `/ j' Q0 M7 z" s9 E: f, x//码表文件
. x- @2 r. M. s" y! \9 {0 xdestfile = fopen("gb.txt","w b");! Z. w3 l+ p- {8 ]5 S, z
//转换生成的GB码文件
; {6 l* ]& I$ o; J; w0 \0 Bwhile (!feof(sourcefile)){8 k9 d" ?  j6 _: ]
fread(& que,1,1,sourcefile);8 i- u5 }; |3 Y. _' r6 D& A  L
if (feof(sourcefile)){7 r  _( L. B8 v$ e. N1 k2 T
break; }1 s' @) G- C9 X" ^' R0 u' S# w# f: V
if (que> =0xa1 && que <=0xfe)
1 q  E8 H8 K1 y$ ]6 F//叛断是否汉字(BIG5编码)
1 P/ W& |# J# ?' ~5 f& `9 U/ R" @{fread(& wei,1,1,sourcefile);
- l. j  H5 Z4 X2 S. d$ m( K, |if (wei<0xa1) wei = wei - 0x40;5 i2 G4 T2 g$ Z
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;" `$ d- {& Q" U6 o
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);2 s1 H, |: F8 b( B/ o+ g
fread(& que,1,1,tabfile);- h6 C' i/ o% u2 f
fread(& wei,1,1,tabfile);; B' l! b# i/ e
fwrite(& que,1,1,destfile);
; b2 Q7 c" V7 x; D, sfwrite(& wei,1,1,destfile);
7 B$ z# K3 D4 c* w! @& }}7 F- h; C8 H* ~8 Q& f0 b
else
- ?% q% S& K0 j- T4 P# o. L% Jfwrite(& que,1,1,destfile); //处理英文3 s- H/ T0 d% j" a) w# _+ X' H
}
! e0 u" v+ w& w7 m5 f3 h' I5 n+ sfclose(sourcefile);2 L0 J+ f  g$ E1 C. b0 c
fclose(tabfile);' s% w, f$ f6 K
fclose(destfile);
# X, _6 y! V, C0 |return;2 T/ W+ W, @4 E! y6 ~$ L
}4 X3 Z  j+ H* r# P3 R( G& e, ^
2 J: }+ `7 J" h1 N5 [
  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。" D5 A  \3 V0 _& q% p$ r% U5 n9 |4 d

9 H" d* E) V% |4 K$ x/ T5 _* ^  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。9 m, o4 z) f0 l, q2 E5 W
, z1 a4 k; A6 K: x; P# f6 W
第一步 制作码表文件
  ^$ o* `$ G+ u( T& L( T
2 r; t+ ?+ d' }- z% d9 y0 G: x  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。+ i/ g5 d+ K+ G( G3 f0 M6 n! [
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。
6 i! }7 y% x9 a2 t/ s+ U; k+ f% j# u7 i2 g
* K2 G( |/ Z7 c' u# X, j   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。
1 L9 Z9 {5 u/ |, W  O: r+ U7 }' e$ u
8 q; U9 v  N1 O2 G9 A( ]//TURBO C 3.03 @- o3 s) w: f* L& Q( N) a
#include <Stdio.h>
( N: g# i  Y5 m  U! n- b$ c#include <stdlib.h>
, }( F+ E/ Z$ J3 Mvoid main(){
$ ^) A# {. q/ [. A$ W6 g. HFILE * codefile;( o4 _( R4 _! i' f8 Q; q2 q
int I,j,k;
. S' A& K- |8 U: hcodefile=fopen("table.txt","w b");
4 [. {' ?6 J& ?1 B( b: ^for (i=0xa1;i<=0xfe;I ){
! q& p; y- p# Ffor(j=0x00;j<=0xff;j ){) X0 {3 u# b# r" X$ Q( {; j
fwrite(& I,1,1,codefile);
* C% h- k' B* T, \6 E! V, Ffwrite(& j,1,1,codefile);}
, c, @  Q$ S- U2 J1 F9 W) u}
) s. Q1 @! G- g/ [fclose(codefile);
. X, Y$ _& J  S8 ]) M7 lreturn;
- Q& s( j1 X. {. c6 R}
) Y$ u& n  p. J  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。; g7 G1 g& p4 o0 u, l. Y
* `7 X6 u+ u) d; Q  p
# O/ T5 x3 D0 U, y# t! j
第二步 转换
+ |: k6 ^  j# i4 X) l" Y# Z) e$ ?* T8 k
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd
* K. |/ ]% J$ R9 T* l  下面的源程序,将BIG5码文件转换为GB码文件。; j' _5 [" v% A

; [% E+ J  n8 S//TURBO C 3.06 ^( E' t, o: u* |2 y
#include <stdio.h>0 ]7 d: @2 }% s8 _$ i, p
#include <stdlib.h>
- S( `9 A; L1 b0 \7 U3 Cvoid main(){5 H8 x% W4 B/ Q( L8 i
int que, wei;/ J/ A& ]! T( ^
FILE * sourcefile;
$ V9 _' q4 L% m/ m( v- e( XFILE * tabfile;% w- T  `8 W* t4 O3 v& K/ _& |
FILE * destfile;
, P3 L1 m6 H% bsourcefile = fopen("big.txt', "r b");
. p9 Q4 C+ X6 M" B* Y! P2 Q) I4 r//BIG5 码文件
6 w5 Y/ P; X4 y- K% u* dtabfile = fopen("table.txt", 'r b");# `0 h0 `% w1 b0 s) k0 [) z0 ^
//码表文件
. P. }$ d6 U7 |5 d1 \3 Z3 Tdestfile = fopen("gb.txt","w b");2 a' y6 |& _& m
//转换生成的GB码文件+ O: t' P8 L1 J0 {" e6 B
while (!feof(sourcefile)){6 [. X0 V1 w/ L# ~% N5 c
fread(& que,1,1,sourcefile);* s* B! @/ d. q
if (feof(sourcefile)){7 p/ S7 `9 _% k2 _  j* \' F
break; }
2 t) N" V3 D. I+ O$ y' _3 D" q8 Tif (que> =0xa1 && que <=0xfe)3 R  Z; s9 `' @4 w3 U8 h
//叛断是否汉字(BIG5编码)% @2 |5 f5 T& A/ }, ^  D5 C
{fread(& wei,1,1,sourcefile);1 z* T* P) Y, o0 j4 d- k0 E$ W
if (wei<0xa1) wei = wei - 0x40;6 l. E! V2 A6 w; J
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;9 a, \7 v. D) Q2 R' x& N
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
2 g0 g' [& k" S& yfread(& que,1,1,tabfile);
; ~7 J9 W6 N3 B! ^fread(& wei,1,1,tabfile);# r7 l: V' o/ x( x6 b# J6 g
fwrite(& que,1,1,destfile);
& L7 V. h0 ^* P- ffwrite(& wei,1,1,destfile);
; e9 h6 _; _, p# y( L}. K, [0 ]  |4 {& ?0 B
else
7 b  S8 m7 j( a# L0 q5 Yfwrite(& que,1,1,destfile); //处理英文* k. t2 B2 @* R
}6 L6 b, S9 w1 ~9 ~( @
fclose(sourcefile);
! ?2 f  ~7 V6 z( }" B+ S: j0 L, bfclose(tabfile);$ o4 j# x% p1 {# I, T1 F
fclose(destfile);" B! y# S8 r# O8 D9 v2 h
return;
( R4 ^' D: {- C& D  Y- X) a6 z; W6 R}- u0 P# F; o- O1 z  S

3 j: k1 g2 e3 v5 [' }# Q0 S" x* O  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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