数学建模社区-数学中国

标题: BCB3.0中让TRichEdit支持BIG5内码 [打印本页]

作者: 韩冰    时间: 2005-1-26 19:27
标题: BCB3.0中让TRichEdit支持BIG5内码
<>BCB3.0中让TRichEdit支持BIG5内码; `4 g9 u$ h! b5 b% h
陈寒秋</P>
6 t( j- }* T' U% u! V2 D<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。% k3 k8 B* c# |# b  K% h
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
! }9 o( F/ D$ n" k    第一步:找一个用于内码转换的码表文件。
' S8 i) f8 T$ ~- l% U4 ]    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。4 a8 P/ M6 t1 u! V2 U/ K
    第二步:把码表文件转换成数组文件。见下面的程序。# h* t' @  M1 b3 v! k
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:, j! H6 Q# v2 m" B% R4 k
#pragma hdrstop
5 P* E4 I3 ^: N) N#include &lt;condefs.h&gt;+ J- M5 U4 m/ v4 y* t
#include"stdio.h"$ P" X2 n9 d1 ~
#include"stdlib.h"
& S  k9 _1 J' j: s#pragma argsused
  n7 m) ~$ I! j* h( dint main(int argc, char **argv)  E6 p* N+ ^3 J9 Y  B
{& S  Z6 ^" R- E' U  {6 ^  x$ X
    FILE *tab;; |) @- ?: @4 e& i8 n- ?
    FILE *hex;
- L2 A% |( O: g; y$ n, o    int i=0;
! y9 Q1 n# j- R; Q2 j    unsigned int ch;  @- s$ c5 L& D
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
. N  o4 Y) F) i9 i  M2 G    hex=fopen("tab.h","wb");
* P) @8 a8 g1 h( M& E) \! k    fputs("unsigned char tab[45840]={",hex);& p, `, J! W6 c
    fprintf(hex,"\n");6 A" J8 J2 ?) l2 J% _
    for(i=0;i&lt;45840;i++)
/ ]* c. d7 U! T    {9 s8 a0 U; d5 A7 S+ U
        if(i%20==0)
* ^* g& D; ~& X4 t$ B1 }% z        {
3 j' L( I  f# @) O1 n, w            fprintf(hex,"\n");
8 m" U" {  P7 @8 }6 \0 v        }1 M9 ^0 p0 D7 E
        ch=fgetc(tab);
6 z. {: F" P( u2 x( g% f' r        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
2 z) {4 d" w& X3 M5 _( I    }. s9 r' t2 Z: y/ B" S( Y# g! r: ^& [1 F
    fputs("0xff};",hex);& A" Y" E, k7 W+ j- q
    fcloseall();. d$ j& k. A* X0 j# _! F
    return 0;
, v5 c- b/ Z3 V5 U8 f/ p& U}
4 R/ P5 _4 ]/ i8 i/ Y, V% [然后编译并执行这个程序,得到TAB.H文件。2 ]( x1 Q; F8 H) C2 u
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
. u5 O2 I6 _1 O4 G! {#include &lt;vcl.h&gt;
* R* I$ e9 ]2 J  A4 X2 z, \6 p#pragma hdrstop
1 H; h( r9 x7 m8 g#include "Unit1.h"/ w6 g/ X: M& K% M% l3 \3 ^
#include"tab.h"//把头文件TAB.H包含在内+ f' o" Y3 J7 J! b; ?0 I4 _. R! m
//-----------------------------------------------------------------: N' M. h1 H% t5 Q
#pragma package(smart_init)+ {) O& Y8 v3 z* ]$ L- B# F! n8 `# t$ V
#pragma resource "*.dfm"8 z% d7 G; m+ `6 `* H) V' r5 L
TForm1 *Form1;
0 ~) j6 m# l  z  S8 O' d//------------------------------------------------------------------# w# h  H8 Z  t) O0 T3 _0 F
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
8 h7 I) f8 ~  b{
, }6 k5 X1 H3 z# o! \1 R! m}  j( R/ f2 ]2 W
//------------------------------------------------------------------
* }7 ^' w! d3 @4 |- dvoid __fastcall TForm1::FormCreate(TObject *Sender)
, H) d+ d. ^- {/ H: u# Q{
4 n# n( o) `# q7 g. `3 L/ A    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定+ C( z4 |7 ^* K. g0 J
}
4 Z. |6 N- y. G# d//-----------------------------------------------------------------
! }+ z+ P" T: E+ H% R0 Rvoid __fastcall TForm1::Button1Click(TObject *Sender)
/ \! V% G9 y- h  h+ u2 k{9 ]1 K* j, M( y# ]
    unsigned long i,address;//把BIG5码转换为GB码
5 {) e* w( Y# h) ^. b    unsigned char ch1,ch2;
3 C/ n+ i. H- K# R    char *x;
. O/ _8 T- S2 E* ~8 M9 c: D) g: k    x=RichEdit1-&gt;Lines-&gt;GetText();9 h: V% ~' Z+ m$ [7 I3 W2 C8 @: ?
    i=0;
8 g# |" R- V: P    while(x!='\0')3 v2 B9 _% z1 e6 A% \
    {
5 K; E, k: p& M4 h$ O0 [5 M        ch1=x;
3 A4 ?2 }! }* J( g3 A) ^- n        if(ch1&gt;=0xa1)$ Z4 V$ K! s1 K3 z. W% _/ \. _
        {
  z  c! t: `1 e/ S" W% R0 i+ a& T2 V            ch2=x[i+1];
1 n3 I7 ]8 ^' \7 [& p9 A            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)- v4 S$ }1 m' {/ S% T8 i7 k* _
            {
0 u1 n+ B# ]: {1 B% J- t& D0 s                address=ch1*314+ch2*2-33010;1 ?0 ?3 _0 w0 O$ T8 i
                x=tab[address];- o% c) Z& x, a! x# ~
                x[i+1]=tab[address+1];& [" f$ a: I0 Q  r
            }1 L; x; H; o( @' Q+ G  g
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)6 @8 W7 q) ^$ Y/ K* V" p  P" Z
            {1 y5 J; U  f' M+ t7 _: [. d% S
                address=ch1*314+ch2*2-33078;# E2 g; b  C0 M7 ?' g
                x=tab[address];2 N- r; @4 V% R' G2 Y9 K" K
                x[i+1]=tab[address+1];" R; [; K. C8 C* _
            }8 J3 C9 g5 p* o. V$ S+ b
            i+=2;
/ v1 b. M' Y( K1 R" N- D0 a4 M        }
, F5 E: w/ x. O8 Q6 t        else$ u( S; G0 V( |6 k; k# p* u- I; l/ b
        i++;
* m. B: u% c3 M9 J8 B    }& X2 ]( A; l  X3 ]' |5 o5 l5 o4 [& X
    RichEdit1-&gt;Lines-&gt;Text=x;: }! c4 B3 s* E; [
    RichEdit1-&gt;SetFocus();& H( _3 l) d  x# T& U1 Y; @( ?" L
    RichEdit1-&gt;SelStart = 0;3 X0 |8 k3 q& v5 n5 Q7 O# x- X
}
7 X- {+ V/ O6 Q2 s7 ?6 ?" G    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
! b' @! @# k5 k) h* D) r</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5