数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 19:27
标题: BCB3.0中让TRichEdit支持BIG5内码
<>BCB3.0中让TRichEdit支持BIG5内码
, E, _! C, b8 X! u  Z陈寒秋</P>1 R5 \! a. d' N8 B" K
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
; \9 y' o" e6 f- F    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
# _& W& L7 L, R% H4 B    第一步:找一个用于内码转换的码表文件。/ g9 [+ y% a: V$ D
    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。7 [- w- q! b  i' ^$ X! T, |
    第二步:把码表文件转换成数组文件。见下面的程序。5 p% P. U' M# q5 \" F0 S% E- F
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:! v; p' a+ l. {  W& ~
#pragma hdrstop4 Z' |3 o( k% k  T! r3 F9 O
#include &lt;condefs.h&gt;
2 S8 p5 M' C6 \, S" T#include"stdio.h"
0 J0 q4 B, F7 E) ]2 z: t#include"stdlib.h"5 i- }; n' f2 S2 o; U
#pragma argsused6 Z+ h. v; g6 z' @
int main(int argc, char **argv). F- h  m; C2 K; E, \; x1 [& [) m
{
/ g# R# k1 {9 o9 x6 |    FILE *tab;, {  u1 _: h, \7 t9 Q; n1 O' q
    FILE *hex;
! f) o2 e8 F0 n: M. c4 r( |- K    int i=0;+ l7 V& _2 a3 E6 ^
    unsigned int ch;: g8 Q, N5 ?6 A/ J& K
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件5 R# b2 j8 A# A0 ?; Z3 f
    hex=fopen("tab.h","wb");  R* @/ A  @2 b. J3 y
    fputs("unsigned char tab[45840]={",hex);
% a) s5 F/ s+ u& ~* V2 S( I  }+ X    fprintf(hex,"\n");' v/ M5 H, z/ x  O. R" e
    for(i=0;i&lt;45840;i++)' L2 ^- e. R% N$ z+ C
    {! P% N3 r. Q/ n/ W  p5 @, `
        if(i%20==0)8 q9 A  i! k! }6 y/ @9 \( V
        {
$ f5 o0 N0 Y$ Y( \8 a# X8 }            fprintf(hex,"\n");
% y. A4 l- e! w; m1 ~        }
# Q6 Y# s0 Y# N0 A$ `- M8 D        ch=fgetc(tab);, x5 x- R  f* D* N
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件4 y3 g3 J3 a; T# g3 G- t
    }
6 N9 Y  K) S& }8 X. u, B    fputs("0xff};",hex);+ Z) P  }' d- T# Y* }
    fcloseall();4 h/ i  ]8 u# |
    return 0;) ^4 S/ x2 m  u7 ?' Y; m* |
}. K" I& d, {: d, B/ r
然后编译并执行这个程序,得到TAB.H文件。5 P, B6 G  N( i7 J8 H
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
! A4 n  G3 X$ g2 B+ Y' n#include &lt;vcl.h&gt;) b9 |' v8 v2 s: c8 {
#pragma hdrstop9 M9 S# h0 H, n2 ]3 l, P* y: g
#include "Unit1.h"7 ^. l2 d& g3 n" t
#include"tab.h"//把头文件TAB.H包含在内
$ Q/ [1 k2 V6 R  I4 A5 R9 _//-----------------------------------------------------------------
" ^3 J! s  E# N2 ]6 @- e#pragma package(smart_init)
2 D1 y/ B5 a9 i* j#pragma resource "*.dfm"$ c9 L0 X" B1 t; |7 D/ q) f# |1 F
TForm1 *Form1;
$ V" R4 r4 N; X1 {7 G3 d//------------------------------------------------------------------" M" p$ l- J: f' [( ]7 w
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)4 {5 o/ o+ ]( _* ?$ s3 r
{
7 Z& a/ k, n) m; B; m}+ v! e9 M9 g+ X9 }5 i8 X* i% V
//------------------------------------------------------------------
/ u. V2 X; |8 V' p1 dvoid __fastcall TForm1::FormCreate(TObject *Sender)+ v' `5 K/ w: H& X1 y5 Y9 M4 s
{- ?9 O% \' O# m8 R; ^) Z
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
: p( M0 ^1 ~# x  S4 X. B}7 x8 N: o  p* ]- d
//-----------------------------------------------------------------, Y/ Q1 X% m! U0 O2 T$ Y( ?( o
void __fastcall TForm1::Button1Click(TObject *Sender)* @2 h. ~, b& R  }2 g9 M! [# |- H
{8 `# I# B7 c. a+ n5 n! J
    unsigned long i,address;//把BIG5码转换为GB码$ N- `5 X" l& [7 @( x3 w
    unsigned char ch1,ch2;4 v* n  L  A. u7 m1 w5 E9 W
    char *x;
) Z9 T% v) Y  z' e& r% S. G    x=RichEdit1-&gt;Lines-&gt;GetText();4 K. \" Z  r4 _- G
    i=0;$ r6 w" y8 S$ W: P$ a' @$ j! O: T
    while(x!='\0')" F) {; [6 o4 ^; U
    {4 n, u0 z& t+ d5 [% f
        ch1=x;7 }: _* m( S2 c
        if(ch1&gt;=0xa1)
/ Z' B; n; z+ h" X4 \, o- w        {+ D: o$ W" D+ P! i3 c) H# `$ D) n
            ch2=x[i+1];
' i" E- U2 B; X            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)! C6 A+ O; O' n0 S5 ~. k9 k& e% L1 W
            {
& `* n" B# P9 V) C  f' ~- F$ k                address=ch1*314+ch2*2-33010;* N1 H4 K2 L; W# M; ]" ?/ L: o- B
                x=tab[address];
& ~$ X  Z) I( b" P                x[i+1]=tab[address+1];
& W5 W9 f  f- Z3 c' e            }
. a) k7 u* b% M            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
! `& r. Z" N/ }1 D2 P. ?, C            {
( ?: O. W4 w  `( E6 @, C                address=ch1*314+ch2*2-33078;0 c7 _! i. M) I& [8 d* D5 o
                x=tab[address];
6 g! g, _  i" p7 [  E  a                x[i+1]=tab[address+1];
! y4 w/ l4 h7 W4 v) {" F: `. A5 c            }
! b) H  |5 J' v7 ~9 _5 |  T            i+=2;7 K0 B1 M; q" X! u! B1 Q
        }
8 l# j: c1 Y% K: B* T        else. R* _. {% s8 T% l' E" W$ {# X
        i++;
  W0 ?! }7 K0 m/ f5 H2 [/ S/ n5 z    }$ C: [4 D% K5 {; R
    RichEdit1-&gt;Lines-&gt;Text=x;
" M4 Z; K5 l' ?5 p( W& n    RichEdit1-&gt;SetFocus();
' l/ Y. l# c0 i0 c3 S    RichEdit1-&gt;SelStart = 0;
# d2 z4 e/ v6 r) S6 H0 G}) K8 y, G8 R4 \; g4 R
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。, |7 U2 ]5 t7 O6 Q+ a% c3 K+ H% f
</P>




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