- 在线时间
- 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内码2 |$ l# z6 @6 S& w
陈寒秋</P>! ?* X [: F6 g) ^9 E0 ]; F1 z# H( d
< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
* F. l( i) w4 k2 E$ V( [, y 由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
. D* n T7 k) A: k9 g 第一步:找一个用于内码转换的码表文件。
8 d4 W. j; y- e' x 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
. K2 d# G' l: R1 ] 第二步:把码表文件转换成数组文件。见下面的程序。+ m) ~4 I, x8 y/ B7 f! R4 i1 A
用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
8 V6 n& K8 A y; |0 v#pragma hdrstop" v& s8 _0 b0 `1 p8 X2 t
#include <condefs.h>, l4 B( h, n1 Q, n, C- x
#include"stdio.h"
+ H {/ M# [. h! L4 F' |5 P# z3 P7 Q- ~#include"stdlib.h"
_1 B' d+ V. w R6 e* i" j#pragma argsused3 v9 K6 z; E9 n/ {; m
int main(int argc, char **argv)
6 N7 `% p5 r! L( S8 _8 h, K{
, n- F4 d( b6 J4 _' u; Q5 P) g FILE *tab; ~4 X3 f; s1 W) c7 H& G
FILE *hex;
9 Q: \. ?! q& w3 Q' v1 Z) ~ int i=0;6 d0 D/ j, h& X; a4 p2 l
unsigned int ch;
! |: q8 [4 m% W3 G tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
. e! u! v* J8 @8 i6 Q3 ?$ s hex=fopen("tab.h","wb");9 j1 ^$ I( I' b5 v B: X- Y( M3 V
fputs("unsigned char tab[45840]={",hex);
/ `4 f, ]$ L: s$ _ fprintf(hex,"\n");) `8 T+ b' |1 s# Y( B9 G
for(i=0;i<45840;i++)9 G1 g, {8 Q. V7 U: u
{- h+ U7 |( f+ n0 s. r
if(i%20==0)
/ k: C, W1 T1 o P4 o0 h" w {/ G: d' g$ g5 C; m+ m+ @9 \$ e
fprintf(hex,"\n");
, }: \! e' _6 t }
/ q' y7 U* M1 n" ^! y ch=fgetc(tab);. U/ C) r# w4 A* P- O4 H. n
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件3 K& k5 P7 k1 y6 u. p+ l
}. H: B! c* e( x, ~
fputs("0xff};",hex);. _- l) R" u8 q! \% G: F# y
fcloseall();1 u* e E. d0 s& }$ j. A
return 0;
+ g9 [' w2 X1 d+ F& \( V9 X}
+ P5 D" D* c. h' H然后编译并执行这个程序,得到TAB.H文件。
7 T7 T# A' I( Y% H: [1 s 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:- n) i( \, C2 z& J% @: V9 j
#include <vcl.h># j+ m! A( }; L1 U# J* A$ G5 U
#pragma hdrstop7 o# e: r6 ]8 ]& ^7 B5 @
#include "Unit1.h"
* m6 ^- i/ R9 i0 u' x4 j#include"tab.h"//把头文件TAB.H包含在内
* ?, U2 d! h/ {7 ^9 g" x6 E//-----------------------------------------------------------------
- e0 H+ j; y4 s- |' R% j E; j" A, E#pragma package(smart_init)
" E; Z6 v, _8 D" o) L- v#pragma resource "*.dfm"
" m9 J ~* W" OTForm1 *Form1;
" S; j. N/ l, S4 N8 a. d D//------------------------------------------------------------------- ?* M6 r- `' q1 g0 R
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)% E4 a$ k' M2 a. z
{
7 b$ j) T9 h0 @( r, r- }}
( W w. F) b# c* X0 Y//------------------------------------------------------------------8 Z/ _$ i( U, E7 r
void __fastcall TForm1::FormCreate(TObject *Sender)
+ O1 l& n1 @' s/ v: A* s E |{# X# ]8 c# b/ z' B* q
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
% H4 S& ~4 L$ @2 h}
% T! i' T/ Y' A5 ^8 s" J2 C( W//-----------------------------------------------------------------
v5 H; d9 _8 V% Rvoid __fastcall TForm1::Button1Click(TObject *Sender)& M; e/ j; V* Z; ^
{
- J6 { O5 }1 L unsigned long i,address;//把BIG5码转换为GB码& U; p" M8 g' |. U
unsigned char ch1,ch2;0 r; K- X& }1 |2 r0 L# E$ i2 ?
char *x;; m* l: l. k. |# y! p. q; d3 ]* h
x=RichEdit1->Lines->GetText();
2 X; z( A, d( D1 A i=0;0 b8 e& I, g j, w# w5 Y K
while(x!='\0')6 n! `5 a" f0 ~8 n, P/ ^
{8 m1 [4 t6 D7 _, x2 N* A
ch1=x;( O9 i# J0 a+ r3 P* K
if(ch1>=0xa1)* ?, q5 O8 n4 i5 D; P+ g, y
{
0 x5 l) a j$ H9 _1 j ch2=x[i+1];
. o+ T* T% ~6 T7 m" x2 E if(ch2>=0x40&&ch2<=0x7e)
5 [( F1 ^5 j; @- | {
! N8 L7 q8 K& \! _ address=ch1*314+ch2*2-33010;
; s' H( q. A1 R8 X5 i1 ^ x=tab[address];
( }0 C3 K1 p+ W. K6 l: E8 ?; d x[i+1]=tab[address+1];
; A- Z* V3 z, E }5 h4 o) \: \3 j! @
if(ch2>=0xa1&&ch2<=0xfe)
5 O7 L/ Y9 L( ]: |% o, C% o: V" { {
. k d+ M3 `# B. P3 J7 | address=ch1*314+ch2*2-33078;+ w% {- w7 U* I7 b _
x=tab[address];
) F& w% O3 O6 h; v, Q A+ ] x[i+1]=tab[address+1];
/ g- K& @) L6 P' E' U" v/ A- \& e }
6 s3 q/ p4 y" v4 I4 d i+=2;
H) U7 z; k" N( ?) r }' g- Q x% O( ?4 \- H
else* \9 L M i4 U
i++;9 z0 q% k6 Y. K& s+ [
}7 K- O x/ x# _( x
RichEdit1->Lines->Text=x;4 [+ b# T3 U0 }1 `1 w3 u
RichEdit1->SetFocus();9 ?2 M: }+ B# i4 Y
RichEdit1->SelStart = 0;
2 E# g' x7 k" N& v8 h: f* ~6 E}
# {1 T* x, o2 z& e) K; ~ 编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。. p, n/ n0 K% P/ I
</P> |
zan
|