数学建模社区-数学中国
标题:
BCB3.0中让TRichEdit支持BIG5内码
[打印本页]
作者:
韩冰
时间:
2005-1-26 19:27
标题:
BCB3.0中让TRichEdit支持BIG5内码
<
>BCB3.0中让TRichEdit支持BIG5内码
; `4 g9 u$ h! b5 b% h
陈寒秋</P>
6 t( j- }* T' U% u! V2 D
<
>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
% k3 k8 B* c# |# b K% h
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
! }9 o( F/ D$ n" k
第一步:找一个用于内码转换的码表文件。
' S8 i) f8 T$ ~- l% U4 ]
我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
4 a8 P/ M6 t1 u! V2 U/ K
第二步:把码表文件转换成数组文件。见下面的程序。
# h* t' @ M1 b3 v! k
用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
, j! H6 Q# v2 m" B% R4 k
#pragma hdrstop
5 P* E4 I3 ^: N) N
#include <condefs.h>
+ J- M5 U4 m/ v4 y* t
#include"stdio.h"
$ P" X2 n9 d1 ~
#include"stdlib.h"
& S k9 _1 J' j: s
#pragma argsused
n7 m) ~$ I! j* h( d
int main(int argc, char **argv)
E6 p* N+ ^3 J9 Y B
{
& S Z6 ^" R- E' U {6 ^ x$ X
FILE *tab;
; |) @- ?: @4 e& i8 n- ?
FILE *hex;
- L2 A% |( O: g; y$ n, o
int i=0;
! y9 Q1 n# j- R; Q2 j
unsigned int ch;
@- s$ c5 L& D
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
. N o4 Y) F) i9 i M2 G
hex=fopen("tab.h","wb");
* P) @8 a8 g1 h( M& E) \! k
fputs("unsigned char tab[45840]={",hex);
& p, `, J! W6 c
fprintf(hex,"\n");
6 A" J8 J2 ?) l2 J% _
for(i=0;i<45840;i++)
/ ]* c. d7 U! T
{
9 s8 a0 U; d5 A7 S+ U
if(i%20==0)
* ^* g& D; ~& X4 t$ B1 }% z
{
3 j' L( I f# @) O1 n, w
fprintf(hex,"\n");
8 m" U" { P7 @8 }6 \0 v
}
1 M9 ^0 p0 D7 E
ch=fgetc(tab);
6 z. {: F" P( u2 x( g% f' r
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
2 z) {4 d" w& X3 M5 _( I
}
. s9 r' t2 Z: y/ B" S( Y# g! r: ^& [1 F
fputs("0xff};",hex);
& A" Y" E, k7 W+ j- q
fcloseall();
. d$ j& k. A* X0 j# _! F
return 0;
, v5 c- b/ Z3 V5 U8 f/ p& U
}
4 R/ P5 _4 ]/ i8 i/ Y, V% [
然后编译并执行这个程序,得到TAB.H文件。
2 ]( x1 Q; F8 H) C2 u
第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
. u5 O2 I6 _1 O4 G! {
#include <vcl.h>
* R* I$ e9 ]2 J A4 X2 z, \6 p
#pragma hdrstop
1 H; h( r9 x7 m8 g
#include "Unit1.h"
/ w6 g/ X: M& K% M% l3 \3 ^
#include"tab.h"//把头文件TAB.H包含在内
+ f' o" Y3 J7 J! b; ?0 I4 _. R! m
//-----------------------------------------------------------------
: N' M. h1 H% t5 Q
#pragma package(smart_init)
+ {) O& Y8 v3 z* ]$ L- B# F! n8 `# t$ V
#pragma resource "*.dfm"
8 z% d7 G; m+ `6 `* H) V' r5 L
TForm1 *Form1;
0 ~) j6 m# l z S8 O' d
//------------------------------------------------------------------
# w# h H8 Z t) O0 T3 _0 F
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
8 h7 I) f8 ~ b
{
, }6 k5 X1 H3 z# o! \1 R! m
}
j( R/ f2 ]2 W
//------------------------------------------------------------------
* }7 ^' w! d3 @4 |- d
void __fastcall TForm1::FormCreate(TObject *Sender)
, H) d+ d. ^- {/ H: u# Q
{
4 n# n( o) `# q7 g. `3 L/ A
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
+ C( z4 |7 ^* K. g0 J
}
4 Z. |6 N- y. G# d
//-----------------------------------------------------------------
! }+ z+ P" T: E+ H% R0 R
void __fastcall TForm1::Button1Click(TObject *Sender)
/ \! V% G9 y- h h+ u2 k
{
9 ]1 K* j, M( y# ]
unsigned long i,address;//把BIG5码转换为GB码
5 {) e* w( Y# h) ^. b
unsigned char ch1,ch2;
3 C/ n+ i. H- K# R
char *x;
. O/ _8 T- S2 E* ~8 M9 c: D) g: k
x=RichEdit1->Lines->GetText();
9 h: V% ~' Z+ m$ [7 I3 W2 C8 @: ?
i=0;
8 g# |" R- V: P
while(x
!='\0')
3 v2 B9 _% z1 e6 A% \
{
5 K; E, k: p& M4 h$ O0 [5 M
ch1=x
;
3 A4 ?2 }! }* J( g3 A) ^- n
if(ch1>=0xa1)
$ Z4 V$ K! s1 K3 z. W% _/ \. _
{
z c! t: `1 e/ S" W% R0 i+ a& T2 V
ch2=x[i+1];
1 n3 I7 ]8 ^' \7 [& p9 A
if(ch2>=0x40&&ch2<=0x7e)
- v4 S$ }1 m' {/ S% T8 i7 k* _
{
0 u1 n+ B# ]: {1 B% J- t& D0 s
address=ch1*314+ch2*2-33010;
1 ?0 ?3 _0 w0 O$ T8 i
x
=tab[address];
- o% c) Z& x, a! x# ~
x[i+1]=tab[address+1];
& [" f$ a: I0 Q r
}
1 L; x; H; o( @' Q+ G g
if(ch2>=0xa1&&ch2<=0xfe)
6 @8 W7 q) ^$ Y/ K* V" p P" Z
{
1 y5 J; U f' M+ t7 _: [. d% S
address=ch1*314+ch2*2-33078;
# E2 g; b C0 M7 ?' g
x
=tab[address];
2 N- r; @4 V% R' G2 Y9 K" K
x[i+1]=tab[address+1];
" R; [; K. C8 C* _
}
8 J3 C9 g5 p* o. V$ S+ b
i+=2;
/ v1 b. M' Y( K1 R" N- D0 a4 M
}
, F5 E: w/ x. O8 Q6 t
else
$ u( S; G0 V( |6 k; k# p* u- I; l/ b
i++;
* m. B: u% c3 M9 J8 B
}
& X2 ]( A; l X3 ]' |5 o5 l5 o4 [& X
RichEdit1->Lines->Text=x;
: }! c4 B3 s* E; [
RichEdit1->SetFocus();
& H( _3 l) d x# T& U1 Y; @( ?" L
RichEdit1->SelStart = 0;
3 X0 |8 k3 q& v5 n5 Q7 O# x- X
}
7 X- {+ V/ O6 Q2 s7 ?6 ?" G
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
! b' @! @# k5 k) h* D) r
</P>
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5