- 在线时间
- 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内码. |% |) N& I s9 q0 j1 W2 S
陈寒秋</P>
+ Q* G( v. Z8 _# A+ s0 a< >大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。 S$ I ?+ U1 G. v+ b0 g' N
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
6 m d8 l+ J) h. {+ M4 j, z 第一步:找一个用于内码转换的码表文件。
' m3 @" A' U. H/ T9 r, P/ g; ^ 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。' v( \9 x* j7 q) n
第二步:把码表文件转换成数组文件。见下面的程序。0 L/ U( e3 O1 n% ]- C: m$ O. A
用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:" d' u) c) y: _4 E: K5 l
#pragma hdrstop
" f0 w) K6 b0 R) G# X$ N#include <condefs.h>
! X- k3 u8 ^% t; N' Q: |' a#include"stdio.h": c8 `& J0 j3 R( x2 Q
#include"stdlib.h"
" V5 i! U! {8 d, `& ^6 ~* v/ n( x0 W#pragma argsused
4 H8 K& J) B1 d+ v, N. ~int main(int argc, char **argv)
( @9 y- r: u3 `7 \( {! M! h' v6 T, k{
+ _( q, L, I5 J1 e4 X FILE *tab;* g8 I5 Q9 t' O/ u' X8 n
FILE *hex;
( W# ~7 {9 U( Z* E; E int i=0;& ?! p4 Q4 C7 E
unsigned int ch;
# {/ m- W5 m6 `( y) l% N tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件5 `/ c6 r- S) O4 E
hex=fopen("tab.h","wb");
8 d2 |3 o9 n) s0 ]7 T% o fputs("unsigned char tab[45840]={",hex);
* C( @9 E; i3 ?1 w fprintf(hex,"\n");
; R) p0 j) C" B4 a" Y/ m! E' {$ M for(i=0;i<45840;i++)
' t. ^: A1 ?" I( E( V9 i6 N {
8 L. c4 k, c8 q) {0 @; O if(i%20==0)
& ? M0 `' o: O1 e, z0 v( N8 r; i4 A {
6 h" z3 r: F3 n) c, Y) c `4 H fprintf(hex,"\n");( w6 t! j$ o6 o) [$ I
}
8 S7 {4 v, g0 Z4 f7 j ch=fgetc(tab);6 R! D% p$ x" M( e' L- X4 b) e; w
fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
" ~5 {4 O. h, A# n9 j k }
! f6 L- x' L3 O" V* P fputs("0xff};",hex);
" n6 B& ~/ t3 J' h9 ^1 l) N( p( e fcloseall();* J' v* @$ A' O* W. j4 y1 {
return 0;& l/ X6 X- z# i+ i2 x" Z
}8 s! H/ q* Y- o& a, n0 _2 G: y8 \5 F
然后编译并执行这个程序,得到TAB.H文件。
^' w/ n- h) v 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
' u4 @- W( d; v; H#include <vcl.h>
, }# N$ z' g. {2 q- o# [1 ^#pragma hdrstop
4 {: W8 R( C5 C0 N- d#include "Unit1.h"
% |1 j; N) i0 B9 {& }#include"tab.h"//把头文件TAB.H包含在内
: Q( _) }/ D% n5 z: O7 I/ v6 m/ I//-----------------------------------------------------------------
( ~( P) ~( h J( U- \2 q0 h+ a#pragma package(smart_init)$ o1 ~9 ]1 B4 w8 Y4 A( p
#pragma resource "*.dfm"* G$ t+ `5 I, v/ t
TForm1 *Form1;
+ Y) C( c# d0 `2 X7 X" S//------------------------------------------------------------------
3 x; R% d" \5 i; V__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
/ s% q+ S |! a, n& Q{
' } I9 n2 G+ J4 H/ r0 ~0 v4 @4 z}
* W! S' |6 i; Y; N; B4 D" E' s- W//------------------------------------------------------------------
, ~ w0 G4 ?9 Avoid __fastcall TForm1::FormCreate(TObject *Sender)" P6 u. i% S# P. Z
{
/ e! H/ t7 d, y* Z& M RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定, i% C! N. _8 i! j# F
}/ q' `! }0 k! }' ?9 U+ e: [% o
//-----------------------------------------------------------------& j+ i* B6 e! B
void __fastcall TForm1::Button1Click(TObject *Sender)
( w8 v( Z. v: Q! x% z4 g" V: g{
. x1 i3 z, S5 _' H/ |9 l unsigned long i,address;//把BIG5码转换为GB码
" D) H1 }/ B5 y' u8 e, {5 j( i; z unsigned char ch1,ch2;! l# g" b2 `/ Q8 M+ o
char *x;
( D' b$ Z* S" v/ t x=RichEdit1->Lines->GetText();7 I f8 |1 ]* z8 `7 ]4 Y. c
i=0;2 ^: B8 W% s O" A
while(x!='\0')" n- L& m! g3 j s. p, J- W
{
/ e( j1 c* ?( v" | ch1=x;
7 a1 D! ]- D( e) h if(ch1>=0xa1)
1 @- d1 l% }! f. M$ Z# O {
7 N B3 U. s" ]" V9 L' n2 f3 G/ z ch2=x[i+1];, t0 b& E$ [' E0 ?# M, [. O
if(ch2>=0x40&&ch2<=0x7e)) Q! Y! ~( ?" f+ ?" a3 Y
{& p2 ^. R* V; J/ E! T5 ~$ e
address=ch1*314+ch2*2-33010;
/ O# a, }! x& w0 i% l x=tab[address];
l, I+ e# h# K- F- U2 D x[i+1]=tab[address+1];0 O! }* o7 P ?1 J# \
}
* k1 I! L7 }' A if(ch2>=0xa1&&ch2<=0xfe)
: D1 t4 c9 [+ Y" _4 a {6 V- O4 m- I: X2 e S& d6 |
address=ch1*314+ch2*2-33078;
6 ^) n1 c' q9 {' h/ V x=tab[address];
+ U* h) k" c& D' W7 t& H x[i+1]=tab[address+1];* i2 ]( I1 D& g3 I- @
}7 D4 I3 i t' t9 l7 ~
i+=2;
/ d: e0 C+ m8 f3 }$ \- n0 J }
6 R7 B9 [5 l8 q: f) r; w else6 e% ~$ E& u2 c) q. Q
i++;
3 E2 f, O) w" s/ t }4 b1 u5 I9 c; O2 ~9 ?7 @
RichEdit1->Lines->Text=x;
+ R% O; ]+ S% O/ g4 w RichEdit1->SetFocus();& r* T* k0 b4 c* e4 f; t% W
RichEdit1->SelStart = 0;
* t$ J0 l6 g x8 |3 d}8 S. V/ O! |! h$ F, w
编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。6 q$ I# M: c T8 E1 [
</P> |
zan
|