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

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

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

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

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

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

BIG5码到GB码转换技术  
% t4 n  j( _* Q  t/ \3 z7 J一起学习 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。+ m( `) q( H2 |3 m' B

1 E- Y5 z7 ]- x; l# w  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
  t+ x' ?5 m8 N; ~* n% z0 a1 w2 s2 `) O! [! @& S3 I" c9 X" [
第一步 制作码表文件
7 ^3 h+ v! d4 t$ l$ w3 w& {% U+ Q0 q5 i# p5 x5 g1 ?5 v+ M) u
  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
( O, |8 i6 E) }' ?  {0 m) d制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。. f6 E( R% `8 B, D1 v6 e

- c! N4 r6 {- M   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。, @. J- e' d$ E5 [
+ c3 K" @7 \" L, v# o8 \
//TURBO C 3.0
/ O* W' Q0 M4 w#include <Stdio.h>
! S7 k7 q. [0 }  T#include <stdlib.h>; m2 h: Z! W$ \$ L
void main(){  b) L+ x" Y0 M, n  x* K) x
FILE * codefile;
% o( H9 K: x; E. N( @int I,j,k;
& b  O, C! m. m( scodefile=fopen("table.txt","w b");
- c( j: L0 ~) k* F7 dfor (i=0xa1;i<=0xfe;I ){6 E3 [4 }5 r9 E0 D8 J9 D3 A0 \
for(j=0x00;j<=0xff;j ){
5 q* Y% Q8 S( i+ b/ A' lfwrite(& I,1,1,codefile);
6 v0 i% N' N4 z9 l& pfwrite(& j,1,1,codefile);}
6 u2 ?- ]! K$ R}
. D0 s8 c3 v8 I7 ^9 _/ w% Vfclose(codefile);7 Z/ C7 Z1 m5 {3 e
return;
0 W5 Y! d8 s( D}
+ G% l2 Q, ]' L6 Y  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。. x# |. X! ]6 _( q9 z
# ?1 O- V5 n1 p* F% r( i8 A) V! y2 z

0 P6 _2 g5 G: a# B% c# c% h  Y第二步 转换( ~1 v! [* }+ G$ b) L! }8 K& j- a& b

2 S% j: C9 q- q9 F* J// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd+ ~( i, Z; v# I" Z
  下面的源程序,将BIG5码文件转换为GB码文件。
- h& \, w* Z+ X3 n; x( H- J
) X$ M# f# h' j/ N8 b2 ~//TURBO C 3.0
7 K- y+ Y* q% b6 {( R; |#include <stdio.h>
3 f5 I. ?& j* T6 f3 p4 M0 K#include <stdlib.h>
6 U: u: s6 z4 p( q7 l" Z- Hvoid main(){
6 K+ J5 A' m1 B- x% i) vint que, wei;+ u9 K! _' B' [) _
FILE * sourcefile;/ i5 ?/ ]7 u0 A6 X* F# @! `
FILE * tabfile;( L9 `0 {4 Q. D1 {- @
FILE * destfile;
  y9 |& I+ u- M+ a; t- Ysourcefile = fopen("big.txt', "r b");
+ m6 x( H7 `! j: I* f' ?9 t, T( h+ R//BIG5 码文件
4 y% w0 q8 B; m' B# r. u" atabfile = fopen("table.txt", 'r b");
+ ?) a3 F% f3 ^" s//码表文件
$ U) m; L  Z0 p, x& U: N" e2 Edestfile = fopen("gb.txt","w b");* \2 w) [) j# i2 w; I8 [
//转换生成的GB码文件
! G: q1 s3 F$ g4 W" Vwhile (!feof(sourcefile)){: j/ [6 t0 T$ M/ b3 o
fread(& que,1,1,sourcefile);3 t) D" F; K- g) v, q
if (feof(sourcefile)){; h5 Q# \# p8 C  x3 M6 a3 q
break; }
# G/ O* s; e5 s' k1 w$ uif (que> =0xa1 && que <=0xfe)
$ \: x- g( [3 a! C7 N+ S( v2 s//叛断是否汉字(BIG5编码)8 X$ g6 K% t+ i6 Z6 R/ g' D& y* K
{fread(& wei,1,1,sourcefile);
, W& ~- @7 i8 O. i3 Vif (wei<0xa1) wei = wei - 0x40;5 P6 a' w3 e: @$ g( j3 w
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;* ^, q% @/ g6 X" |8 K" g4 L: I% g
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);
3 k+ b! O6 W& S" j/ mfread(& que,1,1,tabfile);. V. s" q2 U; ^0 _. a' U8 L
fread(& wei,1,1,tabfile);2 L7 c2 n; A0 ^! ^% J9 j, n2 a
fwrite(& que,1,1,destfile);% F  c) N" j" p( w) O  @; u" B
fwrite(& wei,1,1,destfile);" \! `* M3 J4 C( a; c
}
: r8 t, t. U% ~9 g- F* q! ^else: @, l0 e, _6 ^. {# `
fwrite(& que,1,1,destfile); //处理英文2 d. C5 T* S2 d/ U, Q
}
% F8 \* J; D: ?6 |: ?3 m: d. Dfclose(sourcefile);
, Y2 `3 ^) W+ U, H  Pfclose(tabfile);
1 H& T0 B. @( \1 @3 [* lfclose(destfile);
8 S' v( R$ V0 _" D) Sreturn;$ f* n3 v# k. @5 k) w, `, V
}
" p5 g; v* U9 R% q3 P1 e- o/ {" f$ ^0 f  \8 t4 E
  以上程序在Win95/97,TC3.0 通过。稍加修改,也可用于CB、VC或VB程序中。用同样的方法,我们也可以将GB码转换为BIG5码。 中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
4 Z/ F+ y% k9 ^! S
, @9 L4 e. @' M% E% @- x  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。, o; N9 Y+ |3 p) P" {) g& p

. O+ z8 P- U7 q$ I% w6 G第一步 制作码表文件
  s3 y+ \; H9 d' |* W
8 S# ~* F0 |( l  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。* \; \1 X1 h! ?2 B
制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。% o' [6 q- a- r; |
8 F( K5 u" n' X1 a7 ]$ `' c8 Z
   下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。2 E' q; g' z. z* z

6 }3 {! V+ n4 C//TURBO C 3.0
0 k& I$ U* h" l/ D$ @+ Y#include <Stdio.h>3 \! |, k. M* {% U) L2 y
#include <stdlib.h>5 D8 R% m( }6 l/ p7 U
void main(){
  x  I* o% R5 `% ]# sFILE * codefile;* n+ U9 |1 ?5 ], L, N
int I,j,k;
, }/ k! `$ ~" K$ [# f/ Icodefile=fopen("table.txt","w b");, }& v& l6 k& Z" m- V
for (i=0xa1;i<=0xfe;I ){
0 v* ]* q: {1 q- K# H9 K& _: l7 dfor(j=0x00;j<=0xff;j ){( n0 }# l: E5 @1 D* ^& X
fwrite(& I,1,1,codefile);" N* R3 t2 g( U, g( V' _
fwrite(& j,1,1,codefile);}
, L1 Z, _, W6 E/ R4 q) }5 p" w}
. ~9 W/ E/ M6 i. m$ E! h+ ^4 rfclose(codefile);
! w( m6 c4 Y2 S4 A) I1 u2 j' Preturn;( `5 P" P4 Z/ W  G4 y
}
2 _, o$ z6 @4 q& u* I/ d3 A  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。( j. p% K$ |  L2 p! v

( E' c  T* E3 \  ~* r0 Q' \' I2 Z9 }* B, Y4 L
第二步 转换
3 Q( S& Y9 r" W  M7 K, T/ X
; o2 T" O- o' ^( }# ?) H4 L// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=166&d=8dgfdd( a9 e! p  e! a3 c5 b3 c2 q$ j
  下面的源程序,将BIG5码文件转换为GB码文件。
4 q, a8 o, z! |" M- m/ l
: \' r' f& B1 x4 G( R9 q1 `//TURBO C 3.0$ f0 a8 E+ b$ X9 H; {/ h
#include <stdio.h>
: [: K8 J, a  M#include <stdlib.h>; ~1 T/ @3 k' _& m; L  H
void main(){
6 L/ S) i  N" G) d( d0 T+ s% bint que, wei;( q' Q" ~% a: ]6 x
FILE * sourcefile;. w9 B) G  l7 m4 m
FILE * tabfile;
) e4 I, B  E/ w4 s) e" V) _FILE * destfile;
, H( a6 R% z+ w. }! v2 Asourcefile = fopen("big.txt', "r b");" f7 v; c" A. g9 v4 D
//BIG5 码文件
! [, T3 h  \8 z8 i( Ltabfile = fopen("table.txt", 'r b");" A! R; F) A( A
//码表文件
( s" y# C  c6 y' R7 _1 Z! M$ ~; @destfile = fopen("gb.txt","w b");
3 o" G$ w9 ?" W# n7 M  v" Q//转换生成的GB码文件
9 e  U+ |7 o, O0 X  U, fwhile (!feof(sourcefile)){
, B/ w9 \: r2 c( c0 K6 p, dfread(& que,1,1,sourcefile);: ~' j* {3 {( S
if (feof(sourcefile)){
5 k% \. ]5 N+ X! E2 t2 _  L, J  mbreak; }
3 J- Z8 `/ y# X1 eif (que> =0xa1 && que <=0xfe)
' r: j5 t0 g: X0 d7 j  G  [//叛断是否汉字(BIG5编码)! F1 K8 R0 _3 ^
{fread(& wei,1,1,sourcefile);
4 K6 B  a8 s0 O$ K% Wif (wei<0xa1) wei = wei - 0x40;' j* `: T% _. F6 E. ]$ ?; X
if (wei>=0xa1) wei = wei - 0xa1 0x7e - 0x40 1;; s& g4 Q& K& ?
fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 1 0x7e - 0x40 1 ) wei), SEEK_SET);/ Q2 B& Y3 m, g
fread(& que,1,1,tabfile);. V5 L# l* f$ w% x
fread(& wei,1,1,tabfile);  I7 Z6 K" l9 B+ W4 P. w4 X
fwrite(& que,1,1,destfile);
7 w$ m8 ^2 W. x( u. t3 G' q2 g; @fwrite(& wei,1,1,destfile);
; g3 ^* p( i& J; z}7 U2 @/ J  h' j) a7 N4 l8 [0 B
else
0 z% M" ?2 A) D$ V% L8 x/ Z( L4 Vfwrite(& que,1,1,destfile); //处理英文
' x8 V; X  ?8 r5 @- Q  e}8 G1 V, h& {% T. Z, C! U6 U! G
fclose(sourcefile);* ?" K: W+ ?: p8 Z# l4 n) U
fclose(tabfile);. p% z! Q, b* q& g' C3 C/ e) t+ t
fclose(destfile);! N3 d: c0 U% S2 J
return;7 x: C3 Y3 N3 Y% [$ ~
}4 k; y4 A7 f& @2 ^7 G+ ^
; j3 q2 N  w& O' j" z. r
  以上程序在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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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