- 在线时间
- 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内码
7 l6 S. N- u6 o4 Y. D% H' b: h: R. W陈寒秋</P>
' r2 d R- Q- Y! q& l< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。8 ]& l- q# P$ u3 b* {4 x
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。) n; N! c2 R, M
第一步:找一个用于内码转换的码表文件。
# U' j1 A X0 e8 e# x1 n 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。- x5 n; v/ K- G9 k& n0 Y! o
第二步:把码表文件转换成数组文件。见下面的程序。
; h9 W7 K: t5 b! i 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
M; v+ w; }+ S# P; A) U9 q#pragma hdrstop
( u1 V, Q, o P. P6 E( r# G! q#include <condefs.h>
0 ]. s7 V) N7 |) {. k/ |#include"stdio.h"
+ M' r8 @! m7 I' A# J/ _#include"stdlib.h"
0 x* o5 x, f2 B( o$ B- ^#pragma argsused j8 r" {- F6 H3 x
int main(int argc, char **argv)
! t( |; h# C- s3 D8 |{# s# @4 Z/ M F$ a% {3 ?+ Y; X0 _
FILE *tab;
1 \3 F* D2 O7 d, Z. i1 s FILE *hex;, r* n; y( E: O
int i=0;
" E |$ y, Q1 ]! s. b% D unsigned int ch; ?; p4 R' u2 M4 ~2 h. n$ n+ k/ u
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
! d( h1 P4 M8 b) ?0 \1 `: r$ v hex=fopen("tab.h","wb");
k/ d: J8 s4 ? S fputs("unsigned char tab[45840]={",hex);
4 a8 z) Y* Z+ M fprintf(hex,"\n");. a* `# X$ a5 n# a
for(i=0;i<45840;i++)1 h* V8 o8 I6 v4 l
{. L b8 N! `4 V
if(i%20==0)
/ B+ D1 X. k* o/ c. M {/ q/ D9 Z4 ^, m& D! V% P
fprintf(hex,"\n");
9 u( P6 o8 j/ l. i& Y( Z! D }
: Y8 z" C6 F9 v t ch=fgetc(tab);( ^2 J W3 l" v* J0 \# m" ^
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
0 V O0 Z! s9 w" Y' ? q- @ }
; ]. h) F: Q2 L) I7 o fputs("0xff};",hex);% Y# N' l2 U1 S7 W q
fcloseall();
* y- U( ?+ a G/ S# q/ B return 0;
( t3 L. v4 Y% Y, h5 z) T: G}
F& N5 \0 j2 P然后编译并执行这个程序,得到TAB.H文件。
- _8 U* U+ ]5 W3 g0 Q1 X" P 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
; X% E; _0 J; I8 o/ g- P#include <vcl.h>; _8 r p0 w7 f& p- ^, N
#pragma hdrstop
! ]9 G1 G0 E% `) X6 @#include "Unit1.h"0 A; @( s* p# v
#include"tab.h"//把头文件TAB.H包含在内
- P7 o, T, E% k//-----------------------------------------------------------------4 G% M+ _0 R7 [ }! X
#pragma package(smart_init)
. @: j# P$ b* _ q8 I! O- e#pragma resource "*.dfm"$ y; W- l4 A3 ~. ^# h8 p4 Y: n
TForm1 *Form1;
8 x" j- y& C2 J6 r- Y//------------------------------------------------------------------4 h# I8 P/ \4 @( i
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
7 |, ~, a8 i4 u5 `{
; |1 c% d% N' ^' `% G}4 t4 o; t/ E- o# I& B
//------------------------------------------------------------------; y2 h, E. U+ O" W; i8 [) a3 t
void __fastcall TForm1::FormCreate(TObject *Sender)5 q. D2 ^5 ~' O* x# {- f% v9 ^
{
7 [0 G/ p5 E. h8 \6 G$ K RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定, b( n. [# x% ], p) [! A* Q9 u
}
- G M( t2 |2 R% j, i4 ^5 b//-----------------------------------------------------------------1 a; ]! q2 _- ~4 U1 w
void __fastcall TForm1::Button1Click(TObject *Sender)
% R7 s$ d' _& H) Q$ b{2 X$ E% C% A/ o6 W( i+ m
unsigned long i,address;//把BIG5码转换为GB码
7 W5 G+ S# f. b5 Y unsigned char ch1,ch2;
1 p! U1 _. Q9 b char *x;
) h/ E( J2 R/ v) w' T x=RichEdit1->Lines->GetText();
8 V* ^% i# O% C% F# T i=0;
5 r" }- g( b3 K2 v9 W/ M4 V while(x!='\0')+ A% r; K8 s. S5 s8 Y, s
{7 O% t9 u; Y, N. c% |+ B) I. a" M2 B
ch1=x;8 e' Q. x& p' Z) D# ]; M
if(ch1>=0xa1)# U* f; W+ E' w; e
{
; {9 M B& \/ a) a7 r- l" m ch2=x[i+1];- x; ?6 b; F5 a) O/ |* t
if(ch2>=0x40&&ch2<=0x7e)2 V% c2 r3 B+ B3 w3 U" _
{( w0 L- K; d; B2 | x% ?
address=ch1*314+ch2*2-33010;
- X8 e3 `) S: Q1 | x=tab[address];2 N* l4 ~% Z& P8 t: T/ d: U
x[i+1]=tab[address+1];, s$ P5 |7 T/ c0 W! u7 O
}
1 k! m2 T' M" M" i& U if(ch2>=0xa1&&ch2<=0xfe)1 j1 P4 e' a. @1 Y
{: _. S/ [3 @' M5 {. d+ d! p6 |, {6 t
address=ch1*314+ch2*2-33078;# I% {# f1 ~+ }. S" [- Q! Y3 m
x=tab[address];
7 V6 B6 c9 f( o x[i+1]=tab[address+1];6 `& [: w* V$ t9 s8 [7 `7 {8 K! q3 m4 v
}
; {0 {9 ]. N! i4 d) i% q. _ b0 g i+=2;
# O% _& m* T0 i" t2 S! p. j }
5 A5 n7 c9 J4 d else3 V$ }' k: [" ~/ X, h
i++;
; c d3 @$ W3 ~4 n2 y. j7 B3 W }
& C, C. L7 M" G$ D/ s RichEdit1->Lines->Text=x;5 Y' R! q# e5 n! i1 A. `
RichEdit1->SetFocus();
. J# e. a5 H2 d RichEdit1->SelStart = 0;. K: m: f' ^% X$ e$ w
}4 c8 ]* H( ]/ x1 d3 W
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
- t. q5 n- s. Y' L</P> |
zan
|