- 在线时间
- 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内码- i0 O# \9 S3 Y1 m
陈寒秋</P>
/ ?6 o( g7 S# [( a8 ^2 Q< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。! u! C. ~4 X- R F1 Y! `( c+ N
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。% v. U) T. U$ T$ G# O& i
第一步:找一个用于内码转换的码表文件。
4 Q0 f; }" R$ g9 E& l: h4 Y 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。' N( m+ W# f( V+ [6 l* F
第二步:把码表文件转换成数组文件。见下面的程序。
# g2 V% n1 t4 I 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
# ~4 _) ^" |6 }% x7 U& r2 W) [#pragma hdrstop
+ ^/ P3 f& [! c7 p#include <condefs.h>
4 [& n- _& L) x2 Q- j9 W#include"stdio.h"
; U3 C# ]' C# o' f6 `3 J0 R#include"stdlib.h") i8 B! t% K, R' a$ V% Y
#pragma argsused
5 f( K. ]2 ]# W2 F2 eint main(int argc, char **argv)) k& ~3 I4 [7 K& F9 P5 _ p
{
/ A) [5 V3 p; H C- ]: M; S- N/ t FILE *tab;* p3 Q: v, F; F: G
FILE *hex;( L+ b6 h" r5 l: x/ t6 A. x; }
int i=0;- e' a6 {/ X& ?# m
unsigned int ch; z0 p- p" N. a* R+ K# V. \2 N
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
, }* v7 q$ ]3 [. V" o( b! ? hex=fopen("tab.h","wb");1 P' n$ ?) v# ?! B# n, X
fputs("unsigned char tab[45840]={",hex);! _8 l" j" Z7 z! U. q( \7 I" n
fprintf(hex,"\n");! S" g- v' Y% b
for(i=0;i<45840;i++)
5 K9 a( k- e; D" x7 k {
3 I7 ^, s. Y3 l" |1 \+ {6 C' \ if(i%20==0), o* W# s" r' l
{
8 k1 ]5 b# K% S2 z1 j fprintf(hex,"\n");# D; V2 a6 z! S
}$ ^! c9 {, J7 Q8 O, w: z. g
ch=fgetc(tab);* d' q, K% }* e8 |$ q* N
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
2 _5 x& w3 M: A" t! n) a }/ a6 P' s4 g! K m; x! G2 w- O
fputs("0xff};",hex);
! g: \* _7 F3 a- \. f. I fcloseall();
6 P; t6 `+ N7 W return 0;
2 i: e o& G' c. @, \% V. {}
9 {! v& d# G& c! E2 i然后编译并执行这个程序,得到TAB.H文件。
5 I. N$ Y1 r2 R1 B2 |7 \ 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:) Q( p [6 W' A; V z9 m, e
#include <vcl.h>
) c7 ]/ J5 F0 b#pragma hdrstop7 k x3 T( K; R' z# G1 f
#include "Unit1.h"6 h, }+ E; L! t L: R
#include"tab.h"//把头文件TAB.H包含在内
3 M$ P/ V( z8 }8 d//-----------------------------------------------------------------
. X0 z, U+ k# l$ }#pragma package(smart_init)9 Z" @4 W1 q& ^, V
#pragma resource "*.dfm"
' Z8 ^( P9 \ h+ QTForm1 *Form1;6 b: v8 Q9 D$ C* Y7 G
//------------------------------------------------------------------8 o6 {& H6 O( y) V0 A9 T: \. b$ J
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
7 B+ y0 N) p3 b{
1 F; T5 B3 t' L9 Y}" |2 t/ d/ V' D2 }2 B
//------------------------------------------------------------------
7 B- c" Z6 k& c) H# [) k( bvoid __fastcall TForm1::FormCreate(TObject *Sender)
7 \5 U9 \6 @/ w( d- W{0 A* `6 o# l. Y1 a2 k, `2 J" `- F+ x% g
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定' o# a. k2 u( u1 k
}, V/ ~# l0 [% d% i# F1 T2 R
//-----------------------------------------------------------------
9 }& Z: y# ~0 t6 T5 A7 ~5 d2 {$ Avoid __fastcall TForm1::Button1Click(TObject *Sender)* z* j' Q2 j* D" f* s
{9 W9 M" I9 @, K
unsigned long i,address;//把BIG5码转换为GB码3 c1 U. V" B f$ G
unsigned char ch1,ch2;! F6 f7 s; M) w' l3 L5 W
char *x;
- t7 S( Z7 E0 D7 P7 m% G& k x=RichEdit1->Lines->GetText();' C3 { k: H2 Q* g3 i
i=0;3 e/ _: F j& ?5 t
while(x!='\0')
+ T4 s' r% e: P2 q+ m8 T9 N2 Y {7 h# J# Q9 G+ k6 _% }4 u7 A4 f' [
ch1=x;
' m5 E; u7 e6 o) c0 O if(ch1>=0xa1)$ D* y9 A: R# p; o i9 _- X; O
{& g- a( l/ v5 ~& E: d
ch2=x[i+1];5 a {6 `) \5 K: P
if(ch2>=0x40&&ch2<=0x7e)$ d8 X0 _& u5 x2 l/ ?! P! p
{- q4 r6 h0 Q% S" i
address=ch1*314+ch2*2-33010;
+ U$ g/ o5 `4 g! P# p# y; P x=tab[address];1 R# v, Q$ Z6 v- Q# E7 w
x[i+1]=tab[address+1];
0 x* q6 K, ^+ }- w. p* \ }4 I/ I" I9 @' f
if(ch2>=0xa1&&ch2<=0xfe)
) V) g6 W' j+ ?- h/ n* K; J. q8 K {8 {5 W- U+ ^+ v) Z1 h
address=ch1*314+ch2*2-33078;# I( @/ c B' {; w6 y0 S# v7 Z
x=tab[address];
. W- t* \% H9 k4 c1 a4 F x[i+1]=tab[address+1];
4 x, _/ f d3 [+ w+ Y. ]! T }: }) u; f9 o- `3 a, V" r2 W
i+=2;% ~' Z) f% I( U+ ^4 p: u2 w
}4 M& B% P' [, d1 l/ B
else* R! k$ H7 s$ _& Z; N% F
i++;
+ |+ E0 ]: ^3 M% [ }
6 y- L: ? i* F- z- s g RichEdit1->Lines->Text=x;% J5 B: ^( P" M9 r! @: X* w5 V' V
RichEdit1->SetFocus();
3 L3 @: j8 Z9 O. j9 k RichEdit1->SelStart = 0;5 Q3 c3 T' ]3 z L) v
}+ X: r* ?6 b0 M2 i9 G( O+ f; O
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。5 `2 i0 E# E" [
</P> |
zan
|