- 在线时间
- 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内码
3 T9 H2 Y. v% e陈寒秋</P>/ N/ l( ~* w v7 u% J1 j7 y9 x
< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。1 E6 D7 x. r- A. M$ K" ?
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
9 a' t$ ^7 y; o$ b 第一步:找一个用于内码转换的码表文件。8 M; G1 Z3 D# f; O
我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
& I- E7 z, s4 ]7 s3 t, [$ E 第二步:把码表文件转换成数组文件。见下面的程序。$ x& K% S( F; j( _# J6 N5 t
用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
( p/ U7 k l# d% ?) p8 ~3 v#pragma hdrstop
6 Q# K4 ]+ J* _0 O, P, j2 C1 X7 {#include <condefs.h>/ W6 b4 ]: f6 J4 p
#include"stdio.h"" J0 _3 p U& P3 A% J
#include"stdlib.h") V* ~5 f/ e) }( ~9 \
#pragma argsused
}9 g. n/ z1 t h3 S. \: Sint main(int argc, char **argv)
, |+ Q4 \/ \. Q7 I6 ~{
5 ]5 Q! j; u& ~2 m8 n. f# n FILE *tab;
% T* R% X; q+ g* B5 B5 p- y% P" W FILE *hex;
, _) a# h3 |) @9 \- n int i=0;; m% Z% m3 v5 @+ G% {
unsigned int ch;
* q' ?4 I+ ^* @4 o/ e tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
7 e( v1 o3 U7 @ hex=fopen("tab.h","wb");
; M7 i2 ~9 e; M5 z9 x5 u& _ fputs("unsigned char tab[45840]={",hex);
5 R: ~. f: n, U/ w fprintf(hex,"\n");$ g1 C1 m; U3 ?% `+ y) Z4 R0 E' ^; ]
for(i=0;i<45840;i++)' @2 }) `# n+ |4 s+ l) y6 }
{
+ P! L3 C9 h/ X) l( l" W7 l8 | if(i%20==0)3 p2 y8 P. D0 K" ]$ O
{8 Q# ]3 {5 k9 J" U% L: D
fprintf(hex,"\n");
9 j2 D0 R7 }+ w# k8 | } K4 i1 q5 g8 s1 M: |* Z2 J- U
ch=fgetc(tab);
2 c$ L* P' A( r# p$ Q fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件3 ^; @$ Z0 p; W8 T: ~- p4 c" X
}( P* k2 P' g$ K% g$ m+ n: n+ G
fputs("0xff};",hex);2 x+ ~# |' B" y" O
fcloseall();! t% L/ c' O- j5 C
return 0;( [* @! P' e- F' u- W: x
}
( x3 r; F7 T6 r$ ^$ n5 g4 Z& D然后编译并执行这个程序,得到TAB.H文件。- ]& l6 I8 h/ y# ?9 q2 }
第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:+ E0 Z5 a! ^8 {3 A) S
#include <vcl.h>
% C% x$ J3 G4 V! A1 z2 r; L: i#pragma hdrstop3 _ Z. F u1 V3 r
#include "Unit1.h"
; J* D& P, A) P+ B7 {' c6 v#include"tab.h"//把头文件TAB.H包含在内. n- E: Q6 J' t6 I2 k& l
//-----------------------------------------------------------------. J, F' R4 o: W, q
#pragma package(smart_init)
; `, I$ P5 ^1 B7 x. |4 V8 Y#pragma resource "*.dfm"9 \) ^ N+ N( U( \
TForm1 *Form1;
& C) |* Y7 _( o; J% y) ~//------------------------------------------------------------------ @$ i3 r N0 m1 ~+ i/ ]
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
4 \6 s4 g( X1 T) j/ Y! e{$ ]6 d1 N s7 `" a5 g( a+ A
}
- y' y1 O9 ?( |- L- n//------------------------------------------------------------------
6 l" a! R, C! wvoid __fastcall TForm1::FormCreate(TObject *Sender)7 @/ _- Y1 c7 ^5 h8 w+ H( ? q
{
* l- ^: Q7 L, Z7 ~& l ]6 x RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定% h& y5 H# d% R6 W4 N3 _" v
}
& t% P, s1 D) r; {//-----------------------------------------------------------------
* S( s, Q% z" A1 b* ?+ j2 Dvoid __fastcall TForm1::Button1Click(TObject *Sender). x( z" i2 N1 p* c ^4 i
{
& U- D) a6 D( p! ~ unsigned long i,address;//把BIG5码转换为GB码
$ @! Z2 a( x1 D unsigned char ch1,ch2;
' n; R1 h; v9 f5 o& n char *x;6 Y b. c5 ^, x" c* z% v, G
x=RichEdit1->Lines->GetText();( f2 B$ t& h3 k) Y
i=0;
4 e/ `& ~ }1 C* b1 p while(x!='\0')2 J6 M) N+ q3 x8 t9 |3 L' Q7 G
{6 F8 Y; m. r4 h* C& k* v
ch1=x;; M( r8 Z# a1 S: `5 |
if(ch1>=0xa1)
$ j z+ F" _& w% K4 r0 F {
, N* ~3 e' A' ]' l2 u, {9 o1 j+ O8 m ch2=x[i+1];
5 n: U# H, y8 C+ T! r/ q* [0 i; q if(ch2>=0x40&&ch2<=0x7e), c6 r; N# S8 b6 K+ W0 b5 v3 X& L5 o
{- }- x) A% V( h; f" R4 |" }0 k5 w
address=ch1*314+ch2*2-33010;: r' g. p9 i5 _% J
x=tab[address];
D" Y" \% y& v" S. W/ ]9 Y. `& T x[i+1]=tab[address+1];8 N1 F- h2 l% R) T
}
7 g" U% Z9 a0 A' s$ I if(ch2>=0xa1&&ch2<=0xfe)
2 ]; n. P/ e5 T0 x {& A2 d6 F8 W8 h' _7 U* w0 t: _8 n
address=ch1*314+ch2*2-33078;
( c+ D$ R. t8 f9 F x=tab[address];- f a4 y' W( e. ]% N0 p
x[i+1]=tab[address+1];
# A1 H; S5 K3 @( g' d }, V1 |7 H5 c9 Z- l! s! [' i( m
i+=2; g) k1 H1 l6 C6 A9 D7 ?4 X+ i
}* t" O) y4 G& a3 T# q8 j
else
5 ^$ u8 S! S( m i++;/ k! P* \+ a7 \- r2 f
}
$ m$ F; s) V: Z# E+ L2 d" w! n RichEdit1->Lines->Text=x;' x3 l2 p2 g$ h2 ?% |. {' Y @
RichEdit1->SetFocus();
# X4 t- N# ]+ j RichEdit1->SelStart = 0;
8 E. H- f) N- [! F5 i% R3 F- E6 M}
. f7 O7 a5 a0 s6 X: q1 ]& } 编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。7 H+ G$ o9 w8 W$ |# s U& F
</P> |
zan
|