- 在线时间
- 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内码
" j1 o2 J7 c+ I陈寒秋</P>8 g7 B' h5 D' P0 N% q% e
< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
9 P7 a9 u2 Y) F/ o/ U5 h& w 由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。7 o; s& K3 Y9 I, u8 k4 p+ @' v
第一步:找一个用于内码转换的码表文件。# V& c: _9 P4 O4 W3 ^; Q
我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。3 ?+ M. y) N3 h
第二步:把码表文件转换成数组文件。见下面的程序。
9 A6 b& _9 P( X8 }1 j 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
! G# F/ K0 Y* s$ k% P( I#pragma hdrstop5 X w: g" P* J9 c
#include <condefs.h>
3 j4 C9 X4 J0 @#include"stdio.h"; l6 v7 g# y. J/ O4 m a
#include"stdlib.h"
0 @8 n% S! }; N#pragma argsused
& Q& X6 a# x- u5 A) o8 pint main(int argc, char **argv)
9 E) j- z; N1 u% w. C! u, G& T# S{& H7 g, c. v" K& E' q0 x
FILE *tab;
5 m! R7 _& d/ R6 ?( T FILE *hex;
4 \6 d3 `7 D0 _" ]' K/ [ int i=0;
6 o9 X$ s! k V5 l unsigned int ch;
0 S' N$ A o; B+ S% {1 P6 p tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
( ?5 G" ~4 o2 C+ m _ hex=fopen("tab.h","wb");1 F w5 Z; I- E7 y8 W
fputs("unsigned char tab[45840]={",hex);8 t( n* D* R/ J* l+ f' U% }' M. p
fprintf(hex,"\n");! C" ^+ @! N L7 Q" |; d, @
for(i=0;i<45840;i++)
; o& r! J) X6 ?& A {
: W2 C+ H1 T" J% z0 O( K if(i%20==0)8 w/ y4 }, N T' _( B7 I" i
{
P# {/ i& ]+ W3 P fprintf(hex,"\n");
7 m5 ^5 a. u8 ~: H: R }
- T+ t5 K0 r& L* t, o3 y e ch=fgetc(tab);
& O7 c- P2 @) q/ ^. m fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
0 ~6 U; ^& z5 N' t, c' X5 @ }
, a/ Y( k- h/ v/ V7 [2 [% ` fputs("0xff};",hex);
' }2 y U0 R' ], K" d fcloseall();) ^- H& ?- X- A; J3 Y' H( g+ {
return 0;
- B. |! A/ y8 C. B) f- t0 I}3 T% i4 a/ G# M) ], _
然后编译并执行这个程序,得到TAB.H文件。
' B7 J! O N/ E 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
% X* T) a% {" R9 P r#include <vcl.h>
9 p- J; x3 F# l" r' ]3 w#pragma hdrstop, N8 n6 h! C0 a: u0 q
#include "Unit1.h"! e: x0 \8 x+ r1 V1 g
#include"tab.h"//把头文件TAB.H包含在内
4 \4 }: \/ t1 h: a& m3 B//-----------------------------------------------------------------/ U+ M9 v c* c: T, O4 I. I
#pragma package(smart_init)$ W6 Z- o$ m" q1 o' r' Y7 \
#pragma resource "*.dfm") O: h8 O7 t# E$ z4 B" l9 a
TForm1 *Form1;% s+ G( w& ] k0 Z$ t% f! s, I
//------------------------------------------------------------------
4 _1 E9 t6 G! u. a4 E; y__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner): t0 m1 P' d: M9 o3 q. `& m" ]
{
5 o, I9 k7 Q* o& n2 f& a2 t! e}$ S( f: U% X3 z
//------------------------------------------------------------------; {5 E! O5 v7 |
void __fastcall TForm1::FormCreate(TObject *Sender)5 F6 _# G' c/ v2 E+ u' h6 ]
{6 p5 a0 e3 _3 O8 s- j( O
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定! t' m y& P) b
}
' T. U' R! b' L0 F6 G# ~; k2 z7 G//-----------------------------------------------------------------
/ S& n: i# `7 y N2 u% P$ hvoid __fastcall TForm1::Button1Click(TObject *Sender)
D6 e2 j# @0 J9 b{+ h0 m6 z. e; ?, k! v* i, s
unsigned long i,address;//把BIG5码转换为GB码4 ]5 e' i5 \0 S. E3 t
unsigned char ch1,ch2;, u3 P' @( k) X
char *x;
2 Q- o0 D% ] I5 {5 x1 \+ } x=RichEdit1->Lines->GetText();
1 ~3 v& V+ X; j( D/ e* |8 u" W7 z i=0;
3 ]( ~; d d5 |, ]) v( y. ^ while(x!='\0')9 m. p ?2 F+ U( U: q5 E+ X
{
* u& t1 E; R+ V% b# O& A ch1=x;8 Y6 j3 V: E( L4 F) q. s
if(ch1>=0xa1)& V4 b) g/ n( e9 W* n
{
/ Q- L1 f: Z/ a$ n, p5 } ch2=x[i+1];* S6 P, y5 a! E1 _8 c y
if(ch2>=0x40&&ch2<=0x7e)7 |' X3 B+ b- f. r
{$ x V& a( f9 v: z, y
address=ch1*314+ch2*2-33010;
) {) B) l" b) b/ N, x x=tab[address];
' v" |# ]7 ~& K) r* @; M/ F! a x[i+1]=tab[address+1];8 u2 J5 I" h( O/ _2 v4 J
}
& e4 {% c# m6 e& u if(ch2>=0xa1&&ch2<=0xfe)+ m* R) r- T0 f- B" u& U" G
{* r/ y2 }- I; w
address=ch1*314+ch2*2-33078;
+ |% {; V" {1 V6 `/ U+ Q x=tab[address];# V2 B( K6 X; Q6 D$ P+ F1 T
x[i+1]=tab[address+1];
+ N5 c. b5 s/ v+ ~ }
* H! p) x9 b8 q" t) E i+=2;8 }7 a2 G% a' r# _) J% I
}
1 d+ R$ X# }3 W) p+ |; {, q else s' C( S0 N$ B# x: u4 \
i++;
$ S- Q c% k% b }
7 l& D5 n, |+ k8 @ RichEdit1->Lines->Text=x;! Y% v9 C6 ]/ R7 g* h
RichEdit1->SetFocus();
T# D* D0 Y8 f8 y; s RichEdit1->SelStart = 0;
; h" H1 s5 g: t( P}
p; k: S) T& c. g& s 编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
; {1 c: v, A4 ~</P> |
zan
|