- 在线时间
- 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内码
9 T+ G/ w$ j1 ^! S陈寒秋</P>
4 Z" q1 f- J+ f0 c: L, N t< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
- k& F: B/ G% R/ P. {5 N2 l 由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
5 y2 a3 k! {, P 第一步:找一个用于内码转换的码表文件。- z \+ G8 y) C8 b; u
我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。0 ?6 ? Q! j8 L) p% B G
第二步:把码表文件转换成数组文件。见下面的程序。. Y2 u5 v. g- O- S5 v
用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
7 u: r4 m" w3 U$ u! x#pragma hdrstop/ { h: `9 r* M8 S( i9 W: V' ]
#include <condefs.h>
% l2 E* D( C+ q2 b* W#include"stdio.h"
7 m6 I( K( E* _$ G4 p& \#include"stdlib.h"
! o; y8 {+ Z# i! `! \, ? f#pragma argsused
3 @. f. v# M2 Y8 @int main(int argc, char **argv)
8 y$ N4 H' C5 }# t! L* V/ _{
9 A" k9 |: G7 w" C+ c! o5 L FILE *tab;
( o' P% Z" |" v+ h; b. @ FILE *hex;# k2 H+ p( g. [' n" x5 d7 @. D; {
int i=0;
: Z9 k3 Y6 c! i9 z9 R unsigned int ch;9 y8 c, e- X5 o4 T/ p
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
; @6 b# D' ?1 q, `; _ hex=fopen("tab.h","wb");
1 K- ]; ], o- @ fputs("unsigned char tab[45840]={",hex);
, H1 l0 v2 K) n, a1 T/ g/ C, ? fprintf(hex,"\n");
3 \# k7 G p9 C4 T7 L! k, ^ for(i=0;i<45840;i++)
& R7 b2 J* B0 w {9 f6 s; |3 v" s3 V. y! t+ B1 `$ o0 j
if(i%20==0)
0 Q- q2 J3 A$ B( ~ g {. T" [- s0 `; F5 {, Q6 P+ \: ?
fprintf(hex,"\n");
) s1 i# k* l8 t& r4 ] }
6 `, ]% C5 e5 |' w6 g2 j ch=fgetc(tab);, T9 y1 b9 D( g% N) K; H) r# n
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
; n0 P# n1 |: P% t }
* Y$ w" [; Z) W1 r: g9 ` fputs("0xff};",hex);" |/ F# ?4 F, f1 d+ T& g
fcloseall();( V, L5 l( A2 X& B. U0 Y
return 0;
+ }! c; f0 O# o$ C9 j( N}' J3 Q. X8 O- u
然后编译并执行这个程序,得到TAB.H文件。
9 O( [! Q9 F; q( @9 r% u% j 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
) H3 d/ ~% f- I: u) `#include <vcl.h>
' n. `# E% v+ l% s#pragma hdrstop
9 f" {" j3 r8 }; V) e#include "Unit1.h"" S9 `: ~( b; X+ t
#include"tab.h"//把头文件TAB.H包含在内: \- t- s4 V% ^5 {
//-----------------------------------------------------------------0 k* H) Y) q: [) `9 _5 B1 E
#pragma package(smart_init)+ k4 N6 X ?9 l
#pragma resource "*.dfm"; N& h' ^ E% n
TForm1 *Form1;+ j4 @. F5 P& f! u" ?, U
//------------------------------------------------------------------
! ~/ [ z! |2 v4 N; p__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
% q$ l$ z0 Q" F4 b6 T4 f: p4 n{
5 A2 p* \) G) W+ A% A- w}
1 g! ^( B. x3 d. _//------------------------------------------------------------------9 a! W2 |+ W& N$ [0 W0 P( | I7 }& `7 {
void __fastcall TForm1::FormCreate(TObject *Sender)
8 L! J% }" ^) m2 M+ ]0 e0 N+ w' ~{
* I, p8 @, o! L3 }% X RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
3 A) H( x5 j" ^2 U R T}
7 G, _4 F6 i1 P: n- X, x6 i1 d//-----------------------------------------------------------------8 x. L( _3 [! Z/ c
void __fastcall TForm1::Button1Click(TObject *Sender)8 m; e8 W: @0 f9 j
{! ?" z0 t& T" |; U7 T0 n1 a
unsigned long i,address;//把BIG5码转换为GB码3 {) J. q q. P( r% ^
unsigned char ch1,ch2;
' ^* r" Z' b) r1 v. Y char *x;# O3 s0 h1 Z8 t+ i7 B" r7 ^8 E) u
x=RichEdit1->Lines->GetText();. I8 m+ j$ `5 W) H
i=0;2 w" u6 N5 L+ S3 x4 S
while(x!='\0')
. x) c' h. I' T {7 b# b* B1 ?0 w4 T+ t8 m
ch1=x;1 K4 [9 ~0 n2 W; B2 D3 T
if(ch1>=0xa1)2 \: f* P, B+ d" Y" ]) i! F
{
; h# O% U. \; v6 K% r/ `" ~5 D+ A# z ch2=x[i+1];
4 N+ Z# ]4 S* F; c l' X1 C @8 Q* @$ U7 G; O if(ch2>=0x40&&ch2<=0x7e)+ D: K( E/ A: E$ G
{ A! E9 t1 T& g$ g( {. s
address=ch1*314+ch2*2-33010;
" }2 j; ^% N& m( P9 C% p, v x=tab[address];* t0 ]+ d; G+ s. Z' r% V! i
x[i+1]=tab[address+1];
/ k& r% `0 {4 y, A: W6 ~: v }& b! R7 h7 G6 c& `8 H: C6 R
if(ch2>=0xa1&&ch2<=0xfe)6 D7 X$ `$ l$ @! h, k
{( Z" Q' K# S4 {4 x( A
address=ch1*314+ch2*2-33078;+ J% i2 { F+ ?+ F% }- x
x=tab[address];
# n/ o" q: G( ]) K, u6 w6 ] x[i+1]=tab[address+1];
8 F: V, O* T( a+ W& b }7 g* a: m* |4 Q
i+=2;
! D& }5 |: t2 ~4 C, R) w }' C0 z! ^6 J6 |( M+ A9 ]) ?. y
else9 l4 ]7 |& b& _, o% ~
i++;
' K9 I3 q3 o$ y7 e* k" d$ { }
" ?4 E9 B5 k6 V6 B RichEdit1->Lines->Text=x;2 Q9 N. L- U% G6 O
RichEdit1->SetFocus();
; ^' @4 p" [. M) Z3 h) h RichEdit1->SelStart = 0;' u3 W0 @' @; i2 T, _7 e/ O! c
}8 B$ T3 f4 T0 W! G/ \+ J, P
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
2 y* g" f# c6 z6 {5 A</P> |
zan
|