- 在线时间
- 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内码' K$ m0 [! z) K) L+ U; D) o
陈寒秋</P>
- z, }7 J1 \" q2 E+ f' K0 ~/ h< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
9 n/ g& ?; M; p- u+ T+ Y$ Z 由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。$ S8 N0 N3 }7 O- y
第一步:找一个用于内码转换的码表文件。
; G3 ^" K7 ^& m. ^/ c 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。2 T! w- J7 W- i e- X, [1 b( R
第二步:把码表文件转换成数组文件。见下面的程序。
) p/ V L% D. V. g 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
! e2 N0 W& P- o( C" I/ R6 J#pragma hdrstop
& [- w! b8 z' C+ \#include <condefs.h>
) O4 ~. R( ^( G/ j#include"stdio.h"
6 {9 {0 ]3 j& W* B$ [#include"stdlib.h"
5 L% s1 A R4 z7 l- d- _* }$ ]* h/ H q#pragma argsused
" u$ n* S6 N& e( [6 P$ {% Hint main(int argc, char **argv)
7 g$ A: a: W' ~5 b; c. B" }0 i{4 C) S/ Y$ \/ U) l0 k
FILE *tab;
1 h- q9 Q* {2 t2 g$ b# | FILE *hex;2 k7 {, F, P: X
int i=0;; y9 {/ c$ X# v+ F, }
unsigned int ch;
$ F9 |6 k+ {4 U; e tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
0 H! f0 O u. X) j, t e5 V. P/ s V* S hex=fopen("tab.h","wb");
, V$ ]; m% y- q- A; O! X fputs("unsigned char tab[45840]={",hex);5 r5 ` f& Z0 `8 x4 e2 G
fprintf(hex,"\n");! `8 E+ f6 F2 X k: F1 I( ?
for(i=0;i<45840;i++)# Q J: u1 p. y( d
{0 V y [. a3 X/ d' f) m
if(i%20==0)
6 X" o" T. J8 A* r4 g; X' e {
% B! R5 T# i2 J1 ? fprintf(hex,"\n");2 t3 ^) ]% x0 z) D; a0 b1 N
}
; P0 n, ], [' ?% W- }* t ch=fgetc(tab);
' y; c9 Y8 l7 \! V fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件: U/ E: ?( @5 ~3 V
}5 S# x3 z3 P& r: K8 I
fputs("0xff};",hex);4 H* h* T. b) [0 J
fcloseall();. T* i, E+ Y8 u) K. A4 A1 W( o% I
return 0;
3 Q K) C5 j7 g9 ?}8 l6 @4 C* ]& s! C9 C6 I
然后编译并执行这个程序,得到TAB.H文件。
( } Q/ L, F( o" x. _9 r 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
; v) [0 h2 X1 {1 D: F. n8 M: C; ^#include <vcl.h>
2 h, [ l5 J. V#pragma hdrstop
% Q- \1 e6 F2 g" {5 G- B#include "Unit1.h"( ]+ O% x$ F! d0 f0 ^+ z
#include"tab.h"//把头文件TAB.H包含在内
3 U$ ~- t- F+ h0 I h//-----------------------------------------------------------------$ K3 p, B( [& G4 c
#pragma package(smart_init)
# h) W% B. f; q#pragma resource "*.dfm"+ d: r* J. c! n
TForm1 *Form1;. _/ {+ n1 u, e9 T
//------------------------------------------------------------------
+ }* O' Q8 R' w* L. t* {__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
4 J* S3 j$ P- v8 c* r( Z: V{
5 k9 b2 A P# _}
. |! K9 x# Y& d+ K! f# e8 ^//------------------------------------------------------------------2 H5 p, r$ D. s& G# w" `
void __fastcall TForm1::FormCreate(TObject *Sender)
, G( h( Y9 s: V5 G{' Q" X2 i" l ?: x c: {/ Y. M
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定. I- v" G; G) i+ M! W7 U
}1 S! ~, T! A$ i" `* G8 Z8 v' O
//----------------------------------------------------------------- c, T: w+ ^% m
void __fastcall TForm1::Button1Click(TObject *Sender)
) J/ N, p7 J$ \3 m{
: a3 E+ [! g/ B unsigned long i,address;//把BIG5码转换为GB码
/ }, J0 p: N$ W) b" l3 ^0 S unsigned char ch1,ch2;
, b2 z$ R1 S( u, P+ @$ t char *x;3 k/ f5 a" P5 d9 C" N
x=RichEdit1->Lines->GetText();
r, J. p, r+ |$ B9 G+ e i=0;
7 t, n7 \ N5 t( k" ] while(x!='\0')( x& S+ a- P( q+ H. x# l
{8 |1 T6 J& _$ N5 t8 {
ch1=x;- f* W ^, {/ }" I& y" w
if(ch1>=0xa1)
& B8 J* v8 A& E: O/ K7 U/ f {4 @, [- x. T, u) {0 T5 V, t
ch2=x[i+1];
+ ?# L- M& W3 Z if(ch2>=0x40&&ch2<=0x7e)
( G+ N4 L0 ?# b4 X' c, R {
) J' B% N* i, f4 N3 Z! r4 N address=ch1*314+ch2*2-33010;
1 X X' g$ z. b; ?* s x=tab[address];
: U7 {. p1 e1 D4 j. y x[i+1]=tab[address+1];
! \; A# `. P* \% M }, }* ~, w5 T9 L+ M: y; W8 w
if(ch2>=0xa1&&ch2<=0xfe)
! @/ G2 ~5 C: }+ U+ [: J$ c8 r* n {* Z0 {8 |5 _$ u8 k
address=ch1*314+ch2*2-33078;3 ~- L. K1 R( P
x=tab[address];
4 f t9 U2 \/ q& e. X" i) T x[i+1]=tab[address+1];
: f# `3 x& S/ P% a }
/ N { l/ i5 p7 n i+=2;
( W: K; P3 Z, b. g! i, r }
d9 n+ e! H a8 q* o7 d else* O: c# J- s0 s& F* ?
i++;) Z# `: Z1 i6 |" x/ y) v: |( ]& m
}
* w$ X; \' o, a! K# J) f RichEdit1->Lines->Text=x;- n r; K9 t, B' o$ `# k
RichEdit1->SetFocus();7 u7 `+ T5 u& I8 X
RichEdit1->SelStart = 0;
: E4 m3 Z2 ?' C" d& H}
* X8 e/ @) g/ U. t( w& T% B 编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。& Q' h: N0 O9 |* \: O( c
</P> |
zan
|