- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
< >BCB3.0中让TRichEdit支持BIG5内码) E3 a+ w* X; t) J# g
陈寒秋</P>
- V; w* ]3 p! e% Y& p3 _< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
! L5 u/ n% X) i P { 由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。: ? C M( I6 t
第一步:找一个用于内码转换的码表文件。$ ?% w- A4 F9 M! `* N; P
我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
% B/ o: V: T" Q8 D 第二步:把码表文件转换成数组文件。见下面的程序。
2 {+ s3 u2 i2 P0 y9 y' { 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
$ {/ F. Y" p' A+ }#pragma hdrstop& B, ?5 T" A9 e8 V' r/ |
#include <condefs.h>
& j% a$ i. h- C& G#include"stdio.h"
9 f" J. F: \# o& b#include"stdlib.h"
) @$ g. t3 I- r1 S- \- ~; T#pragma argsused
; [0 d2 P Q7 O4 B1 P3 ^int main(int argc, char **argv)5 W+ R" `2 A% o$ {# l
{
( ?% l( p3 S3 |$ ^) Q6 z0 P FILE *tab;+ e: M) E( Z$ j
FILE *hex;3 c3 v; \" o( v9 z4 m
int i=0;
5 w* w4 K* Q) d* a1 c unsigned int ch;: Y, {; s8 y9 v
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
7 i% D" l8 @9 z8 f+ e$ O hex=fopen("tab.h","wb");
( ? m) Q0 @9 a0 I2 ~: N# R' x& y; b fputs("unsigned char tab[45840]={",hex);+ u$ B, x7 T; ^
fprintf(hex,"\n");0 `, l l9 |# ]- M3 i. b* E' T
for(i=0;i<45840;i++)
. {2 T u+ h$ m {
5 U( m. V! G# O8 T7 ~2 V7 \9 S if(i%20==0)+ c( [' i) {! H/ E
{1 R) \' P. \6 Z' b% u
fprintf(hex,"\n");
1 S- G! y3 l( {; b1 q4 h8 j }
+ P, k# @# x. C( f ch=fgetc(tab);1 r; G/ @8 O- F u0 q% ]
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件5 R8 `+ i* ~' e: q
}. X7 x: l S- B+ h5 \
fputs("0xff};",hex);
' U# n! x7 T8 z fcloseall();
; H9 t9 H& z( v1 G G- g* | return 0;0 s) G8 @$ i& X# J, L
}
. a3 M @7 `' M% v$ l, K3 z然后编译并执行这个程序,得到TAB.H文件。: G! i, `) F) l' i1 d- o2 E2 i. _
第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:2 C& J' N4 Y+ k1 ^" e
#include <vcl.h>" }9 C' y- a, V2 y. S
#pragma hdrstop
# M( Z1 _/ m$ }# G#include "Unit1.h"" N5 x2 }3 X0 E8 ]4 y/ [ n4 X! A) h
#include"tab.h"//把头文件TAB.H包含在内, v! Y% ]# C' r) ?, X( Z0 {# _
//-----------------------------------------------------------------+ k0 P& K( |! A) H! _3 V. y$ W
#pragma package(smart_init)% i e7 y9 }/ W4 T* S% q7 W
#pragma resource "*.dfm"
4 a9 r3 V* y5 e" n5 b1 FTForm1 *Form1;
$ N M7 J* \# { U* D//------------------------------------------------------------------( K8 X8 {" M7 b3 e+ U/ [
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
, Q: H) \' x8 b4 i$ O. f8 v/ r' |9 f{, K: N2 [$ Q6 `- y' Q `3 `
}' ]' @; g: c3 f
//------------------------------------------------------------------
' q3 j$ s! C8 xvoid __fastcall TForm1::FormCreate(TObject *Sender)
' D: X( G4 J$ `- j* `* S{
" H* \1 _' \3 u8 b RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
" e! q/ w2 Z( W) p0 f}
* t. R' M* S8 c9 e) D//-----------------------------------------------------------------" m, } F- N, y! h1 ^3 H# W
void __fastcall TForm1::Button1Click(TObject *Sender)
7 x' A. j& M) i# W+ f) e) y{# w* R& ]2 X* i
unsigned long i,address;//把BIG5码转换为GB码0 ]4 \1 T) h5 j' n' G
unsigned char ch1,ch2;
/ C7 b6 ~: v0 O8 f% A7 B7 q char *x;) y% P- Q _. w/ {9 u
x=RichEdit1->Lines->GetText();* B/ [ e/ C' K; q/ X6 p
i=0;
$ x4 n2 g6 b8 h3 ]: ^. F while(x!='\0')
4 Q' C% Q- g) N* O+ e {
& k( P# } Q! ~4 }% o ch1=x;
: x6 K, x0 Y4 P, E if(ch1>=0xa1)
1 j X3 ~# G9 u$ A2 ~8 ^, w. v: P {, e! k, Q5 }4 k, X1 q- R: J
ch2=x[i+1];
7 e7 M( N" b @: n8 g; f6 J! ` if(ch2>=0x40&&ch2<=0x7e)- D( W; Y$ P* `0 B0 J3 A8 ?. Y
{1 Q" R- _) b" n& B0 V% {4 P
address=ch1*314+ch2*2-33010;# C* F% A; h' P
x=tab[address];( H+ f4 _+ ]# ?! m, V
x[i+1]=tab[address+1];2 a% a" V* t) e0 S% @
}7 V- h( D! m! C# o4 E# A
if(ch2>=0xa1&&ch2<=0xfe)1 e9 D& @# c- q
{
5 G" X. Y; i( P2 r0 }6 s( b z address=ch1*314+ch2*2-33078;: k* s0 E& M% u& C
x=tab[address];2 \% P& S2 F0 \, F# ^: n
x[i+1]=tab[address+1];
' ]+ ^- d( o" ] {7 ^! w+ {% [* O! J }
2 C" j9 c9 K6 i+ g( B0 ] i+=2;5 s# A9 y. B& L
}. s3 ~1 \ |- b' M4 y
else0 e M I2 a: j/ \. i( a r
i++;
8 P. A) R: k9 @1 r1 X1 \% g1 e' T }. \- J* r9 r+ ^
RichEdit1->Lines->Text=x;
& L! o* P+ ~- N7 W7 | RichEdit1->SetFocus();/ w/ K# Z6 N5 X- v3 @7 K
RichEdit1->SelStart = 0;
9 ~, D3 _' c6 q: Z# [}
: F; V5 n- R6 T `2 v3 D5 C4 B 编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
6 w( a' S8 ~9 f) \</P> |
zan
|