数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 19:27
标题: BCB3.0中让TRichEdit支持BIG5内码
<>BCB3.0中让TRichEdit支持BIG5内码
2 ~' d$ ^' Y. X( F陈寒秋</P>/ w' G8 o3 H2 z, K5 u2 j
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
4 r8 K! l: J) f    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。; g0 D  L. a  _) z) Y/ n: o/ c
    第一步:找一个用于内码转换的码表文件。
$ k* M  S3 z, H    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
+ L$ ]$ v+ O8 ]0 v8 R- \2 m$ Q3 T+ o    第二步:把码表文件转换成数组文件。见下面的程序。8 z* p" ]5 k5 V0 c+ G
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:; b) _" K2 h  v4 H- r" K3 C" K
#pragma hdrstop
) Y  B7 r" X! @7 @2 {% o#include &lt;condefs.h&gt;
6 J; t" H- X2 L# m) _/ C#include"stdio.h"
) X  s* C; s" b  S8 }" C4 Z#include"stdlib.h"
9 o! B+ K* a7 ?7 Y3 x- Q#pragma argsused
/ ^# S; N  t, o4 z7 {) Yint main(int argc, char **argv)
" _$ y3 ]  r+ ]' b5 A: l{; V5 i& A1 u$ G& ~/ D, H
    FILE *tab;
) }6 J/ Q) s0 z9 y  `0 _9 w" E    FILE *hex;3 X  ^" k, Z, |; x9 C
    int i=0;
; H, ~0 Z: m1 _0 z; Q2 c/ y    unsigned int ch;+ _0 H, m% v. K
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件" d4 c9 P) b" ]1 g) |
    hex=fopen("tab.h","wb");# Y# u+ C$ K: M/ r
    fputs("unsigned char tab[45840]={",hex);
/ Q7 w- b8 J# x5 U3 Q/ T    fprintf(hex,"\n");8 N$ _0 W6 @) N& Q8 b: p6 y2 K; R! @
    for(i=0;i&lt;45840;i++)) B* B) Y2 J. V9 ?$ d
    {6 d" ]/ z' }+ F# y
        if(i%20==0)
1 G9 {5 i/ W/ [. O0 f        {. {+ W' }; p2 B. `9 ^
            fprintf(hex,"\n");
; W1 }; [( ]# \        }# Y0 c5 R9 ?$ |
        ch=fgetc(tab);
$ {- s: j$ w" G- O        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
& p' V) E4 a7 L: x# Q    }" t6 B! G+ H% S( U- G
    fputs("0xff};",hex);
% Y. @& Y) {' F" p' b1 p    fcloseall();+ x% ~1 a1 H% f9 @
    return 0;/ Z: W2 |; W) V. l
}
) W. H& H- h0 g4 p然后编译并执行这个程序,得到TAB.H文件。
3 v( ^# X1 K  D    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:" m* T! U# J% d, n5 w
#include &lt;vcl.h&gt;5 |& W& y# @2 n6 A1 N
#pragma hdrstop
2 g7 p! Y4 i( C5 n0 j3 `#include "Unit1.h"
8 x. @9 t0 |5 P#include"tab.h"//把头文件TAB.H包含在内
, Q; J1 l7 ?1 V3 a/ L- }7 |' Y( S9 Z//-----------------------------------------------------------------
. A9 v( K4 b5 {( T8 H#pragma package(smart_init)2 g$ F' s$ ^' _# Z* G! x8 I
#pragma resource "*.dfm"
# i1 @8 z% `. i+ ]$ C2 X% YTForm1 *Form1;
0 f) G( O* T$ h8 I/ {//------------------------------------------------------------------
8 j# i7 e5 F& }7 f/ x& |# \$ T__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
: _  n. C6 Q7 ~1 d{
, T$ g4 h7 I" T1 N}- Y7 c0 P; v+ \. G# D
//------------------------------------------------------------------
% D. m8 D, {+ n/ u7 G: v' _' Uvoid __fastcall TForm1::FormCreate(TObject *Sender)
% c; o" [3 s) u0 V% o{/ O( z* ~+ c2 ^
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定; Y" O; A5 S/ ~. M" o, J2 L7 ~3 Y7 T
}9 g) O# `9 _0 h# L; z4 Q
//-----------------------------------------------------------------+ [" X, X+ D( J1 F
void __fastcall TForm1::Button1Click(TObject *Sender)
7 R5 r5 E; P9 `( Y* ~( x" {# ?3 z{
. C% }! d0 E- X( l& A    unsigned long i,address;//把BIG5码转换为GB码; h7 y0 B2 B' Q- f
    unsigned char ch1,ch2;8 H; E$ O8 c2 I2 V
    char *x;- D+ N" j  N4 x0 P
    x=RichEdit1-&gt;Lines-&gt;GetText();3 V* E7 L8 i( h6 K4 X- N. a
    i=0;
) M' C* C' e$ C* j4 J. U8 c5 B- M    while(x!='\0')  L3 ?( [- Q4 n) m( X, J
    {
- _& Q0 ?# x" M7 x& y6 ?        ch1=x;- j' H5 i* C% H6 q9 Y: q. q  \, e
        if(ch1&gt;=0xa1)
# P& Y# ~0 v' m9 d! A3 k- J  S6 `        {+ d, l# y% r6 G" j5 ]1 |
            ch2=x[i+1];4 z: m6 g: d' _
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)( R5 L7 W# g7 a3 N, D
            {- Z( S- o4 Y$ {- @) {, j2 m: `
                address=ch1*314+ch2*2-33010;, S! M7 i$ ~3 [# `; t5 Q
                x=tab[address];
8 u) Q, Z: y' V' }                x[i+1]=tab[address+1];
* l" Q0 `; `$ D: m            }
# T9 b8 D( E/ _6 N$ C            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)7 ]8 B/ J3 Y# N$ a
            {
1 J" T' I( I" z5 n                address=ch1*314+ch2*2-33078;) g5 r' i0 F5 \0 a# U
                x=tab[address];0 x  _% [" N: ^
                x[i+1]=tab[address+1];
; ~7 j, u# f2 W* Z# s            }! I, b; r: S) T, K9 Z! f8 @: k! w8 g
            i+=2;
; E& w- ~" R% H+ M0 `; n        }
' q* K0 {1 G. b* G& B$ M0 ~+ B        else
8 t8 n; Q! o) f: _+ N+ P) S+ Y. I( R        i++;
6 J3 [) l. H7 {% ^    }3 A: v0 T3 g% I  ?* m1 ~7 m. |
    RichEdit1-&gt;Lines-&gt;Text=x;
5 T: S0 s; _3 n. P    RichEdit1-&gt;SetFocus();7 Q3 H3 c! e# ]+ t* }* y; m
    RichEdit1-&gt;SelStart = 0;
( e. P- k1 F; t! f5 G, Q}
5 M$ h& t: K$ s9 r! e5 @& O  K+ _    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
2 R& ]0 q+ k$ P, `1 M# J1 [9 F% \</P>




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