数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 19:27
标题: BCB3.0中让TRichEdit支持BIG5内码
<>BCB3.0中让TRichEdit支持BIG5内码1 s7 Q4 t; F! x2 r0 O+ f
陈寒秋</P>
* P% ^7 S' M( i" H9 U9 `: @$ Z. b<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。7 t  R2 d: Z+ y, Y# b+ H: C
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。- K5 R3 G# a1 p2 G; G4 }
    第一步:找一个用于内码转换的码表文件。
% p: x2 W4 v6 F; `# k- O- O    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
+ b4 s  O( e% l; f6 g( O5 Z( N    第二步:把码表文件转换成数组文件。见下面的程序。
: S% j& \# M% Y9 N6 h' a    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
6 b* B6 q% [2 `* O5 [0 \#pragma hdrstop
  C, M3 m$ j- X7 m#include &lt;condefs.h&gt;) J7 Y' C! f; \* J2 \6 l: D5 D& P# Z
#include"stdio.h"( }$ U0 Q3 z* D1 I
#include"stdlib.h"
" R: u3 z- `2 i1 o2 N#pragma argsused- l% c% \8 O+ z! |4 b
int main(int argc, char **argv)
: Q/ j6 O  F0 ^{
" X* {9 ?9 Q( @+ U+ Q    FILE *tab;8 i# I* V% @: I
    FILE *hex;! |  q; S& o2 A0 K- l
    int i=0;
, h; S& P/ J5 `5 l% v$ y    unsigned int ch;
/ @6 g( J1 t- ?1 i% s6 I    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件3 Q* b% K# K1 @9 b& t5 p
    hex=fopen("tab.h","wb");
% i: d! `  s; W. c1 k    fputs("unsigned char tab[45840]={",hex);
/ d) @8 S! G5 L" h2 |    fprintf(hex,"\n");/ @' h* u& M- z) Y0 `
    for(i=0;i&lt;45840;i++), ~- h, G+ E3 R1 J* q* L8 e; }1 q
    {
; }4 S2 x) m$ E+ Z. ^7 G7 W) Q. V        if(i%20==0)& ?+ K# m/ Y- N4 |+ I+ B% [$ V
        {
/ a2 {  P/ R* o0 d9 |8 J            fprintf(hex,"\n");
" U4 ^% ~, G6 o9 ]" H        }* O. X4 S; z1 T) c
        ch=fgetc(tab);
# x0 [' s6 w0 H7 K5 a        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件  t! m) |* V9 u- @4 E/ u& j; K
    }
: Z0 k* {. O: l* _; D    fputs("0xff};",hex);: [' K$ G7 p" @
    fcloseall();
5 u( |* ]7 H  e9 Q3 y) M/ ?4 g  ]    return 0;3 M8 S( C5 ~" |! O- g" O
}: T0 s: {% y* U+ Y( B
然后编译并执行这个程序,得到TAB.H文件。
! K! m% Z5 w8 _- p7 b) e    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
( u: d1 A) l5 @: S% V% \#include &lt;vcl.h&gt;8 A# X# X! y/ `% W" g
#pragma hdrstop' T3 @, }7 U$ G8 w! c8 B
#include "Unit1.h"" m3 X$ U, M: t( {; @2 x: ?- a
#include"tab.h"//把头文件TAB.H包含在内
5 k# {0 j  U$ ~- Y//------------------------------------------------------------------ ?" {6 {% I  T# s
#pragma package(smart_init), `: Z2 H7 H) ~7 }
#pragma resource "*.dfm"
1 i& f2 _* v9 L$ w9 OTForm1 *Form1;
( o8 M7 }( n& h! b//------------------------------------------------------------------
( F2 n9 ?/ f* v; ~, a__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
8 |; Y4 k  [2 b{( L4 I# q# v& W, R, j
}
6 p- u3 d5 L# G5 S( _# G7 q9 p//------------------------------------------------------------------; D: i7 G7 w' x5 J) t
void __fastcall TForm1::FormCreate(TObject *Sender)' M2 ?7 B& I" V. M4 U
{  d! R2 p. G& r' C( Z
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定1 x5 U3 c' h( s
}
, x) [# ~4 ~1 P; g* t: W9 l//-----------------------------------------------------------------5 G8 a* s8 t6 Y; H; `9 r+ c7 \
void __fastcall TForm1::Button1Click(TObject *Sender)
: g0 F/ p! P- z" y{
- @1 R5 A9 E7 |0 L, I    unsigned long i,address;//把BIG5码转换为GB码; T- d; O& [1 ]* ?' S+ K
    unsigned char ch1,ch2;
. M" B0 y# ~3 ?, b: J) }! t    char *x;
# g8 a2 @0 l# X( ]4 r  Y' V    x=RichEdit1-&gt;Lines-&gt;GetText();+ h$ ]1 ]3 }  `6 n4 t) h0 y# i
    i=0;
0 G4 v- ?/ ]  I* a    while(x!='\0')& m1 w& p* P' }9 q% D9 V/ J
    {1 f- ~7 k5 Z* A8 z9 f4 o8 N
        ch1=x;6 W6 G# C9 r% f# I" @+ o4 |& Y" h
        if(ch1&gt;=0xa1)8 V& F9 s1 Z+ n/ n$ u
        {# |3 o2 |/ t  Z# K8 h
            ch2=x[i+1];
" N4 g' M0 T+ W$ H" t            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)
! v0 z7 B0 M0 H            {
& ^+ J8 I- \) X$ _8 H+ R                address=ch1*314+ch2*2-33010;
5 @) |: }( }( Q" T                x=tab[address];! D7 L; s0 Z6 ?, ]0 Q5 {
                x[i+1]=tab[address+1];
$ m" Y1 r, r; H5 d, M; n            }* ^8 ^, z4 Y5 _3 ~
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
1 ]) h# T7 N2 p: s  Z            {
8 w' M, q  v' K3 ~- I                address=ch1*314+ch2*2-33078;
, D! j. m, S: A                x=tab[address];# u1 p3 B2 P0 Z% L, Q4 _3 Z' Q5 e
                x[i+1]=tab[address+1];
/ `4 Y! O% ~. w. w            }+ Q3 `' `5 {2 q0 O; H- B
            i+=2;% O- y6 W! s. t6 t
        }
  G) y3 n# i8 U; N# F        else
5 v$ r. x7 O0 e8 V        i++;
9 _$ i4 q9 p. }6 @    }
+ @/ ?# }: w. `# j# X/ Q3 C    RichEdit1-&gt;Lines-&gt;Text=x;) b: S6 B" u$ r9 l  D: ?
    RichEdit1-&gt;SetFocus();9 T3 Z3 m0 z0 E; G
    RichEdit1-&gt;SelStart = 0;
' e0 A! ~# U+ X}" Y# O0 Q8 r( }  Y# L3 x5 E
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。0 b' F6 |9 B6 Z! _7 J
</P>




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