- 在线时间
- 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内码
: {+ ~- s X! K( M陈寒秋</P>$ c1 d- ?) D3 x: t& z
< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。- X; Q( L9 |8 e# \& [4 u0 W
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。4 d' E) l& g4 n) {$ N. c; [
第一步:找一个用于内码转换的码表文件。* c1 ]7 V4 I) h& \# R8 `8 d' M
我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
* L. C0 S, C! ?# |) G' x0 u5 K/ g 第二步:把码表文件转换成数组文件。见下面的程序。
: r( m- i# r" K! J$ a 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
; S5 }6 p* m$ I. W3 T1 V$ z#pragma hdrstop' u$ Y! K+ u3 K0 G6 a* }: m# N9 a
#include <condefs.h>
' p4 \6 n4 q! A$ u, u#include"stdio.h"
- V$ y4 S* m: g8 l1 f) M; ~#include"stdlib.h"
. e+ e( I2 C5 e+ S7 K3 Q+ N% S#pragma argsused& o4 s. l( T& k" R+ v9 Z7 E5 N
int main(int argc, char **argv), H/ B }) A0 R; c9 z( [
{& k, @ q& v' \0 o. n! _* E
FILE *tab;: x4 ?+ ~% X/ U1 ]# J# \3 y
FILE *hex;
$ B+ w: i4 l1 a int i=0;
# `+ P X1 G1 x2 j+ r- ]# a unsigned int ch;( q' w1 v# T! U
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件 w |3 u& Q. Y8 D6 }
hex=fopen("tab.h","wb");/ p2 L0 L% Z# i) G$ O2 Y' y
fputs("unsigned char tab[45840]={",hex);
" }8 _1 V- {. d7 E( g fprintf(hex,"\n");( `* g% |/ E) Z7 R" U0 \* `
for(i=0;i<45840;i++)" m2 K; y$ U& e8 P$ B) e
{
* y1 w9 G% F, _( U& ^# z' V if(i%20==0)
2 D1 E" z. t+ C# p! g {5 N7 \' W5 J) ?4 v
fprintf(hex,"\n");6 r) [' `2 S( C6 v2 J6 K' W
}5 e7 B0 X2 s; z8 C' i0 n0 y: r
ch=fgetc(tab);
1 |$ ?9 Y" M8 u1 U6 A- N fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
5 e* ^$ L' |! h b$ d: F }
. H. W, l1 `1 E fputs("0xff};",hex);4 S4 g3 p1 F) ]' }
fcloseall();* p6 W, l4 Y" c1 q5 K. f& E( m
return 0;
; N* F' r$ p% x3 ]0 p/ u0 o4 K}
: q- s: n* g0 I然后编译并执行这个程序,得到TAB.H文件。
W5 b! I0 u; n4 j5 ]+ M 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
: q+ q7 |+ e4 P0 U+ x! B#include <vcl.h>
9 b: t% P. g" o, w3 H#pragma hdrstop
% s) U. A+ Y2 J6 h. e* x( v#include "Unit1.h"
2 {* k; U9 ]: E5 a#include"tab.h"//把头文件TAB.H包含在内
) A6 G9 U$ z2 @) r) {/ d//-----------------------------------------------------------------
$ W6 _$ b4 P" E; \; P0 a/ l" B- c#pragma package(smart_init)' i2 v+ H4 J. _6 g6 q2 L
#pragma resource "*.dfm"
/ l" g7 q2 A0 r. STForm1 *Form1;3 L1 f' j, Y! @3 Y* _& r
//------------------------------------------------------------------' F5 I0 d; H' C" r) k
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)) ^& [* m' [! g) F3 ]
{6 e2 b; S, w4 [0 c+ [- ?, P& d
}
9 g- s" O4 W7 D% M; {//------------------------------------------------------------------
) i5 m& o- i" O* N6 R/ Avoid __fastcall TForm1::FormCreate(TObject *Sender)
& O2 y2 u! |! v$ s{4 ^5 p% y% P7 n
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定9 w: {4 V% l( E g' E$ M
}
: }! q x! M0 ?1 W4 M% U& E2 R//-----------------------------------------------------------------
# e6 b+ i6 }! ?/ pvoid __fastcall TForm1::Button1Click(TObject *Sender)
7 h6 \/ \7 P" D4 v2 c7 n# _- O" w{5 |- f! @ w$ x: N( G: T; J
unsigned long i,address;//把BIG5码转换为GB码3 c! ?' {4 L* h, \" m( D
unsigned char ch1,ch2;% u1 N* _6 g) Q- n
char *x;7 @- X. Q, J+ `' b: A% x
x=RichEdit1->Lines->GetText();# j3 u! L$ x' R' V
i=0;: R: [' U% P" Z
while(x!='\0'): _! \5 F' Q% ]0 Y
{
% _5 `2 u$ D$ c* x1 U; D ch1=x;) ?# d) y7 k+ I5 P' D
if(ch1>=0xa1)7 ~4 w7 v* \* g" P8 o/ I2 a2 [+ C5 Z
{
. D9 c( q/ e7 ]0 m# q6 Q ch2=x[i+1];
" {, o* N: ]: T' c if(ch2>=0x40&&ch2<=0x7e). c9 z! s6 u5 \ E
{4 y& T# S& B& \, U, @2 t
address=ch1*314+ch2*2-33010;
' `1 [# I: _, ^( C; c x=tab[address];/ H5 V$ t% N% y$ F2 j) F; f' q: S
x[i+1]=tab[address+1];' L, @3 o1 Y9 F
}
( S. i# i1 V2 |, x( A! v: { X- [+ ` if(ch2>=0xa1&&ch2<=0xfe)
4 { u% V. H0 \- A {
8 c: w4 T% t% D5 h1 ~ address=ch1*314+ch2*2-33078;: i) z8 |4 ?1 {7 h s. D
x=tab[address];
( i: k# {; |) }/ j. S x[i+1]=tab[address+1];% m; y6 f5 i% `" i5 P/ r4 i
}/ }- a7 \) }+ {- s* }6 E
i+=2;" h a! t0 ]9 m; N4 C8 Z5 r4 v7 X
}
* ~- U a+ n9 i7 X2 v" n else
# c( t! r: X/ F+ o i++;" w) l; h/ B% j/ g/ f [$ z/ q
}0 _6 J+ g8 N3 s, x7 {5 O
RichEdit1->Lines->Text=x;6 b3 E! w6 \. |& G) ^4 o0 i* {
RichEdit1->SetFocus();
* }, m# a2 W; x/ ^: z. L" R7 x. ~ RichEdit1->SelStart = 0;
; h/ a9 d2 S- B, r8 _3 {}6 A" _5 o; b9 Y! s' c' L4 u7 _
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
' y9 P8 z0 P/ u k</P> |
zan
|