数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 19:27
标题: BCB3.0中让TRichEdit支持BIG5内码
<>BCB3.0中让TRichEdit支持BIG5内码1 u) W% @( i* F/ H. S" C' m
陈寒秋</P>) Q# s/ H# Q5 B5 K" w/ O
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
% W& w. c' C' ~" A# q, B$ Z$ C    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。& k$ ~: _! L, J
    第一步:找一个用于内码转换的码表文件。
* w' M( _; r9 _( a! k    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。/ t2 M' E1 v3 u$ j* j. q
    第二步:把码表文件转换成数组文件。见下面的程序。
: M/ w# v. A. G9 E    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:: J! |9 Z& Q( X
#pragma hdrstop
- r) \8 k6 D4 R& d2 q# @  l; [2 e#include &lt;condefs.h&gt;) x5 M9 @# z8 E; {3 C, w5 `- N3 J" M2 ^
#include"stdio.h"
+ l, j5 g$ v' m9 Y8 Y#include"stdlib.h"6 w  U  I2 L) ?# B) P2 m* q: i9 k5 _
#pragma argsused
* [/ @( N5 D/ A7 X8 e5 Wint main(int argc, char **argv)" f* z9 L- r$ C
{: |; z* W6 [( Z9 i
    FILE *tab;
8 q- }1 y+ W5 e. k    FILE *hex;7 a4 @: G6 Z; D! B
    int i=0;+ w3 f9 N1 o0 p# n2 |
    unsigned int ch;( z8 W. S$ ]7 w5 A
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件7 ~# R, G3 f7 C/ l7 G7 p, h4 g) H
    hex=fopen("tab.h","wb");
# ?% x' a( }8 k$ G& s1 P    fputs("unsigned char tab[45840]={",hex);
. ]) V# O) k8 o+ A  _9 V" Q    fprintf(hex,"\n");! \+ y& C/ L3 _3 {  E( M, y
    for(i=0;i&lt;45840;i++)
& Q6 r" R8 U* j    {5 D. @: z1 t' ]/ t1 g7 K$ {
        if(i%20==0)
; H3 H$ [2 T: O% z! v        {  l1 R0 G! g. D7 L
            fprintf(hex,"\n");
$ g% X6 C( T8 }2 A+ C  l" S5 m. e        }
5 a7 w; \( l0 J        ch=fgetc(tab);0 D# ]3 B; a" c( ^3 L
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
2 b4 Q6 r: J6 ]+ o, f, p    }
4 R7 X2 `, M4 D; \9 }) G# l" ^    fputs("0xff};",hex);3 X8 J2 u& C& Y6 K! v
    fcloseall();; n; [2 ]; G/ B
    return 0;' M9 ?4 h3 y/ V# b6 y, q: e
}' P6 p  b" Y* ^$ K+ q: v- y
然后编译并执行这个程序,得到TAB.H文件。/ k! J% Z/ a4 c9 ^, a0 y1 S: F
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
) U6 i" S" T3 D" r% }3 C#include &lt;vcl.h&gt;0 e: i" o7 \! E5 [
#pragma hdrstop8 U  `& V+ i- g9 ?, ?1 }
#include "Unit1.h"0 z# p5 K2 Y( n
#include"tab.h"//把头文件TAB.H包含在内8 D( P2 T0 c, {" W
//-----------------------------------------------------------------5 Y0 }" O+ p% l0 V9 n5 p# U# g
#pragma package(smart_init)
7 D) Z% u0 }$ d; ?" C5 L#pragma resource "*.dfm"
( H9 p8 ]/ o8 N! z) kTForm1 *Form1;
  }* \5 ], K7 O0 i( `- ?( }2 m; m$ j//------------------------------------------------------------------! Q% H0 \* [% g2 b, G$ O
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)! l% d2 H4 W! E* n* a
{9 y, g1 f  C5 L, }; ^8 a
}
, S0 I$ `; p% M1 M; `, ~& M+ s//------------------------------------------------------------------
9 K. h1 D0 J4 w2 b4 \1 zvoid __fastcall TForm1::FormCreate(TObject *Sender)( }- |$ G, r% S5 J
{
5 h0 m" w; y5 j1 ~    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定" N' j1 Z2 u; a% j8 t; \1 _6 w
}' `, l0 c5 |4 o6 m5 P1 ]2 O, a
//-----------------------------------------------------------------
) k( P. U4 q8 S& `" N  G$ T% xvoid __fastcall TForm1::Button1Click(TObject *Sender)& Q7 H7 ]4 F$ n& F& X" u
{
3 z) g* L. w5 s% n0 H; a; D, G    unsigned long i,address;//把BIG5码转换为GB码
1 U/ ]% M  w3 _$ V    unsigned char ch1,ch2;" `1 q! D! }4 K1 L0 u
    char *x;, q+ }# R, X$ q0 P) g$ t
    x=RichEdit1-&gt;Lines-&gt;GetText();" y5 w" Y) c+ E9 o& q
    i=0;
" f' v; k4 {% r    while(x!='\0')! ^# F* S, u; ~2 J8 Z  F4 u/ T
    {
+ @9 n# q2 a) U- J. n% c        ch1=x;" M) @: E/ P1 s9 H) @# p
        if(ch1&gt;=0xa1)
! j* A& e$ f1 n- t1 c- k/ A% q+ @        {3 ~1 Y; k- D. ]" h
            ch2=x[i+1];
# W) ^- f5 F1 Z+ e. S            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)
4 m3 e6 L) n  C6 g$ a8 X# ?" I            {
6 K; d: ~6 s; o) E$ V( k" T, n% |                address=ch1*314+ch2*2-33010;
! I5 ~( H1 \0 S5 k3 e* _# `                x=tab[address];1 x8 s4 \% H; t! D: Z! \5 Z
                x[i+1]=tab[address+1];. D. _% C1 z5 @6 Z0 q* F
            }" R* O+ \; ^5 \6 g. W! |* Y
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)& f- J0 }# G" L: R- {6 w0 A
            {" x- F2 e: f, ]: j1 C2 F; g
                address=ch1*314+ch2*2-33078;- I* Q* a. q: o" A8 y
                x=tab[address];
) I* {1 Y, ?) e" W& K: L& @7 H' {/ S                x[i+1]=tab[address+1];3 i' W& p  N( _3 u/ g
            }
. {0 c8 e. e- w  p' H            i+=2;
% m6 n! z* `! B        }
8 E) O% y- r/ _* M% C        else
" h6 [& ?! w9 x6 ^) `0 T/ s        i++;
7 Q& ^8 l: }8 `2 k; H    }$ {6 x, W' f; L. z
    RichEdit1-&gt;Lines-&gt;Text=x;5 }; S6 {+ e/ f$ ]
    RichEdit1-&gt;SetFocus();$ w# g& G9 I" X  P: c9 A
    RichEdit1-&gt;SelStart = 0;7 l! d& }0 n% {
}- N7 e8 x. D8 e8 X( D# w
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。  B2 f5 N+ s- q& [
</P>




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