QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5518|回复: 0
打印 上一主题 下一主题

BCB3.0中让TRichEdit支持BIG5内码

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码
" j1 o2 J7 c+ I陈寒秋</P>8 g7 B' h5 D' P0 N% q% e
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
9 P7 a9 u2 Y) F/ o/ U5 h& w    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。7 o; s& K3 Y9 I, u8 k4 p+ @' v
    第一步:找一个用于内码转换的码表文件。# V& c: _9 P4 O4 W3 ^; Q
    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。3 ?+ M. y) N3 h
    第二步:把码表文件转换成数组文件。见下面的程序。
9 A6 b& _9 P( X8 }1 j    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
! G# F/ K0 Y* s$ k% P( I#pragma hdrstop5 X  w: g" P* J9 c
#include &lt;condefs.h&gt;
3 j4 C9 X4 J0 @#include"stdio.h"; l6 v7 g# y. J/ O4 m  a
#include"stdlib.h"
0 @8 n% S! }; N#pragma argsused
& Q& X6 a# x- u5 A) o8 pint main(int argc, char **argv)
9 E) j- z; N1 u% w. C! u, G& T# S{& H7 g, c. v" K& E' q0 x
    FILE *tab;
5 m! R7 _& d/ R6 ?( T    FILE *hex;
4 \6 d3 `7 D0 _" ]' K/ [    int i=0;
6 o9 X$ s! k  V5 l    unsigned int ch;
0 S' N$ A  o; B+ S% {1 P6 p    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
( ?5 G" ~4 o2 C+ m  _    hex=fopen("tab.h","wb");1 F  w5 Z; I- E7 y8 W
    fputs("unsigned char tab[45840]={",hex);8 t( n* D* R/ J* l+ f' U% }' M. p
    fprintf(hex,"\n");! C" ^+ @! N  L7 Q" |; d, @
    for(i=0;i&lt;45840;i++)
; o& r! J) X6 ?& A    {
: W2 C+ H1 T" J% z0 O( K        if(i%20==0)8 w/ y4 }, N  T' _( B7 I" i
        {
  P# {/ i& ]+ W3 P            fprintf(hex,"\n");
7 m5 ^5 a. u8 ~: H: R        }
- T+ t5 K0 r& L* t, o3 y  e        ch=fgetc(tab);
& O7 c- P2 @) q/ ^. m        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
0 ~6 U; ^& z5 N' t, c' X5 @    }
, a/ Y( k- h/ v/ V7 [2 [% `    fputs("0xff};",hex);
' }2 y  U0 R' ], K" d    fcloseall();) ^- H& ?- X- A; J3 Y' H( g+ {
    return 0;
- B. |! A/ y8 C. B) f- t0 I}3 T% i4 a/ G# M) ], _
然后编译并执行这个程序,得到TAB.H文件。
' B7 J! O  N/ E    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
% X* T) a% {" R9 P  r#include &lt;vcl.h&gt;
9 p- J; x3 F# l" r' ]3 w#pragma hdrstop, N8 n6 h! C0 a: u0 q
#include "Unit1.h"! e: x0 \8 x+ r1 V1 g
#include"tab.h"//把头文件TAB.H包含在内
4 \4 }: \/ t1 h: a& m3 B//-----------------------------------------------------------------/ U+ M9 v  c* c: T, O4 I. I
#pragma package(smart_init)$ W6 Z- o$ m" q1 o' r' Y7 \
#pragma resource "*.dfm") O: h8 O7 t# E$ z4 B" l9 a
TForm1 *Form1;% s+ G( w& ]  k0 Z$ t% f! s, I
//------------------------------------------------------------------
4 _1 E9 t6 G! u. a4 E; y__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner): t0 m1 P' d: M9 o3 q. `& m" ]
{
5 o, I9 k7 Q* o& n2 f& a2 t! e}$ S( f: U% X3 z
//------------------------------------------------------------------; {5 E! O5 v7 |
void __fastcall TForm1::FormCreate(TObject *Sender)5 F6 _# G' c/ v2 E+ u' h6 ]
{6 p5 a0 e3 _3 O8 s- j( O
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定! t' m  y& P) b
}
' T. U' R! b' L0 F6 G# ~; k2 z7 G//-----------------------------------------------------------------
/ S& n: i# `7 y  N2 u% P$ hvoid __fastcall TForm1::Button1Click(TObject *Sender)
  D6 e2 j# @0 J9 b{+ h0 m6 z. e; ?, k! v* i, s
    unsigned long i,address;//把BIG5码转换为GB码4 ]5 e' i5 \0 S. E3 t
    unsigned char ch1,ch2;, u3 P' @( k) X
    char *x;
2 Q- o0 D% ]  I5 {5 x1 \+ }    x=RichEdit1-&gt;Lines-&gt;GetText();
1 ~3 v& V+ X; j( D/ e* |8 u" W7 z    i=0;
3 ]( ~; d  d5 |, ]) v( y. ^    while(x!='\0')9 m. p  ?2 F+ U( U: q5 E+ X
    {
* u& t1 E; R+ V% b# O& A        ch1=x;8 Y6 j3 V: E( L4 F) q. s
        if(ch1&gt;=0xa1)& V4 b) g/ n( e9 W* n
        {
/ Q- L1 f: Z/ a$ n, p5 }            ch2=x[i+1];* S6 P, y5 a! E1 _8 c  y
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)7 |' X3 B+ b- f. r
            {$ x  V& a( f9 v: z, y
                address=ch1*314+ch2*2-33010;
) {) B) l" b) b/ N, x                x=tab[address];
' v" |# ]7 ~& K) r* @; M/ F! a                x[i+1]=tab[address+1];8 u2 J5 I" h( O/ _2 v4 J
            }
& e4 {% c# m6 e& u            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)+ m* R) r- T0 f- B" u& U" G
            {* r/ y2 }- I; w
                address=ch1*314+ch2*2-33078;
+ |% {; V" {1 V6 `/ U+ Q                x=tab[address];# V2 B( K6 X; Q6 D$ P+ F1 T
                x[i+1]=tab[address+1];
+ N5 c. b5 s/ v+ ~            }
* H! p) x9 b8 q" t) E            i+=2;8 }7 a2 G% a' r# _) J% I
        }
1 d+ R$ X# }3 W) p+ |; {, q        else  s' C( S0 N$ B# x: u4 \
        i++;
$ S- Q  c% k% b    }
7 l& D5 n, |+ k8 @    RichEdit1-&gt;Lines-&gt;Text=x;! Y% v9 C6 ]/ R7 g* h
    RichEdit1-&gt;SetFocus();
  T# D* D0 Y8 f8 y; s    RichEdit1-&gt;SelStart = 0;
; h" H1 s5 g: t( P}
  p; k: S) T& c. g& s    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
; {1 c: v, A4 ~</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-17 19:20 , Processed in 0.274266 second(s), 52 queries .

回顶部