- 在线时间
- 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内码+ l6 F# t* j& V' r" `, V, g2 M
陈寒秋</P>8 v2 Z6 i8 A- z) L5 h' U
< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。" N- c+ W* E9 g3 @6 e6 R% P0 X
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。' [1 X, U0 y' ]% C- N
第一步:找一个用于内码转换的码表文件。
( m4 h/ w% Z- y. I) C# d' n [ 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
" B. b$ u2 s( \) T# w 第二步:把码表文件转换成数组文件。见下面的程序。
/ S" {) K v8 ^- T; @, j$ V+ G 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
! e1 A/ u' ~' B3 q#pragma hdrstop0 `8 p; \+ D4 D# Q
#include <condefs.h>
2 l7 y; }* O/ U1 S#include"stdio.h"; [2 q1 I9 S! ^! u/ Q* U, |1 ]
#include"stdlib.h"
, }9 t" `2 ~- k, z/ j* X5 L. ]#pragma argsused
/ X4 H# U) _. x7 ], R4 l, Sint main(int argc, char **argv)0 u& Z/ K7 z/ F0 K
{: A8 E5 X# K- [, G/ M$ E
FILE *tab;
% _, n6 {0 V% `0 H/ i FILE *hex;. V7 U0 f& `# ~: c# e
int i=0;* [$ e' V |: A# P+ _+ E. b
unsigned int ch;
9 Y5 ~/ C8 l6 E: t+ w/ C* H. t tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件: X6 X* {+ [/ C% F M
hex=fopen("tab.h","wb");, G0 R) e. M2 A
fputs("unsigned char tab[45840]={",hex);7 O- o: K) f1 }/ q
fprintf(hex,"\n");1 d5 D0 V* R2 _* n
for(i=0;i<45840;i++), o, v% F" l4 b* J% Y2 l
{# b! h1 l* L8 n7 @6 Q+ R' o/ B
if(i%20==0)# F* q% h3 y' c2 O
{% k8 @" n. Y0 b& w3 O. m2 _
fprintf(hex,"\n");$ s2 d; L# H5 P/ b z+ s
}
6 [, _! ~- D& I$ z) n ch=fgetc(tab);- r2 b) u$ d H$ z# }/ k( b8 ^
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件6 k, b$ R% a8 b# l; G, ]/ E
}
S7 @! F7 m* b0 ?" j7 W3 U K fputs("0xff};",hex);' R+ r2 y5 T$ _( ~4 i$ Y. c
fcloseall();. l5 Y- p. y ^5 L
return 0;" o. w" d0 O( O1 f4 T( ~
}
" a: W$ F& E0 c/ `/ z然后编译并执行这个程序,得到TAB.H文件。
, D/ A* w( b; J! J 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:" d2 C# _/ R$ m( X* b# N y! U
#include <vcl.h>) A% g& M' X( O; {3 n
#pragma hdrstop
8 U1 E7 @7 z0 I6 P#include "Unit1.h". m7 i0 o& q1 z! O. c
#include"tab.h"//把头文件TAB.H包含在内
2 z% i- J& l {+ X0 r# q//-----------------------------------------------------------------& B4 a2 i6 c1 v
#pragma package(smart_init)% _. f$ L1 z* i" [6 R- h3 f2 b1 m
#pragma resource "*.dfm"
: J3 ~2 M5 O! \& KTForm1 *Form1;* Q$ [+ @$ [( w/ K1 Z% S4 ^ H8 k
//------------------------------------------------------------------
3 x5 H9 l( x9 E2 Z) O* h__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner). N1 x# s+ M! u0 B2 ~7 Y/ i5 L
{. l. N# R, }# S' \7 m* e+ |
}: C6 }3 F0 [7 g( h! e0 y/ E
//------------------------------------------------------------------
. ]2 I: s1 g; p6 g% a' zvoid __fastcall TForm1::FormCreate(TObject *Sender)# i! A9 S5 ?9 G; k/ n
{
& o, z9 ~' ?' k; k+ g5 R% S RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
6 Z! l m- A! S* y$ A}
- n. Y2 f! h2 N! p! H3 I0 f( i d//-----------------------------------------------------------------; m0 |3 v$ M6 u! Y
void __fastcall TForm1::Button1Click(TObject *Sender)+ C3 D4 Y k ?1 X1 N( |; e
{- Z8 @$ S. C0 ^: k
unsigned long i,address;//把BIG5码转换为GB码3 _& N* v. l" H
unsigned char ch1,ch2;; F$ N% r# o# R) j A& |1 L9 J
char *x;$ X, l$ g } Y7 `6 E4 g, l; F
x=RichEdit1->Lines->GetText();+ a% i; C5 V" M1 _
i=0;# A) e8 I$ w9 k4 n1 w- Y8 @8 W y; S1 x
while(x!='\0')8 s2 b8 G, ]0 y
{! p' U' i0 b& q4 i, O
ch1=x;5 D& M3 L+ b7 {/ P; E
if(ch1>=0xa1) w \/ b8 q6 }5 W7 _ K9 r
{
+ ^- p+ E3 n' z$ G9 _( `4 N ch2=x[i+1];- \. Z9 e1 I) r3 T) k1 m- b6 _0 G
if(ch2>=0x40&&ch2<=0x7e)
, u0 H/ R8 I8 M# H# u- U {
6 u p7 y7 Y/ o" G2 Z) N0 v address=ch1*314+ch2*2-33010;! ~, {6 F; T9 y. X7 k: k; s
x=tab[address];& E; |5 Q) K" b, z* s
x[i+1]=tab[address+1];
% n6 c" S3 f0 w6 k% s1 q5 G6 K }6 g2 l8 g d- n1 i5 h
if(ch2>=0xa1&&ch2<=0xfe)
' m0 D5 Q" q4 I {
, R; _/ C+ B3 c6 ? address=ch1*314+ch2*2-33078;( I6 f# ~- F9 N7 B" f9 |1 w9 T% V. W
x=tab[address];% r& \2 ^7 V8 q6 q$ ~; L) b& a
x[i+1]=tab[address+1];# a' l4 J: y7 E9 x: C4 P1 G
}& j5 I6 Y7 F+ }( y) q
i+=2;' d4 X- h, K0 B
}
5 t7 C9 `. I4 M# s else$ m4 [/ I7 i2 B% t2 S
i++;
- n% |1 J8 I; y1 ?# [ }
8 [& C3 s! D/ M" U# w+ ~9 M) k1 h RichEdit1->Lines->Text=x;
3 g, Y. ?5 i( C9 w2 D5 z RichEdit1->SetFocus();2 o% Q4 f: ^# O/ R2 m; D
RichEdit1->SelStart = 0;
3 v; i, q2 _/ w O; V' h}+ V8 g0 y2 p( h) }
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。% H7 g1 d& C0 m
</P> |
zan
|