QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码4 H# W- @. I, b* n. E& f5 `
陈寒秋</P>9 D( k( P5 K( Y  ]# {# |
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。0 V, ?, C. J( R0 c2 X* x5 f" O
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
) p! }( K  z7 c9 i    第一步:找一个用于内码转换的码表文件。
1 I' @! v2 |, ~3 b5 h    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
* ]9 T  K0 N8 i    第二步:把码表文件转换成数组文件。见下面的程序。4 |0 H6 V6 L% T  d+ H
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
  H4 P  l) ?; s8 V#pragma hdrstop
! @. f  J4 E! B! L8 ~2 n4 S6 |#include &lt;condefs.h&gt;
: I. w6 C0 k, [* H' N#include"stdio.h"
) R1 h3 ^' H2 C3 W#include"stdlib.h"
$ Y& o% O9 T  e0 w. M4 q#pragma argsused1 L; D6 f  L8 p! K4 I
int main(int argc, char **argv)5 ^+ ?: I; W/ c1 |( X0 g) \
{6 [1 s% v4 ?: }% G' z
    FILE *tab;1 d- U( O% f3 S; V( L) Z3 k: s! C& ?
    FILE *hex;2 |, m6 ^- w1 A, B
    int i=0;$ F1 g: t# Y& F6 y$ t$ [# T
    unsigned int ch;
) s& G) E, {$ W. ^5 z& ?" o    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
& A& }% d8 e! j8 @5 I! y    hex=fopen("tab.h","wb");
% x! g7 Q9 S0 L5 H- L! q( w9 ~    fputs("unsigned char tab[45840]={",hex);
8 J% I( h; T1 O/ I5 O  q    fprintf(hex,"\n");
8 }. S  S: ^- o' [    for(i=0;i&lt;45840;i++)
2 V2 ^+ y1 `( }( D, @/ n    {
. }, z# ]# N2 F% @1 P: F: ?! P        if(i%20==0)
! Z% R  b1 K+ U- v* b2 i1 `! V        {9 ~; e9 c( h  M: u* M$ P! b5 T5 @+ i
            fprintf(hex,"\n");
" }( k# h2 w8 q3 ]+ q4 h        }7 l2 v& x+ N, S6 f+ Q( S9 S! L
        ch=fgetc(tab);' r" P! p  X# m4 N( J. }6 m
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件! \6 Q# ?' n* i9 {. V
    }
& S& l* A& @# j# s* t3 W4 W7 |& O    fputs("0xff};",hex);
0 Y  t+ c* _7 |: a: U  S! c    fcloseall();
' G  @" [. x: T3 Y    return 0;
  h, i! Z3 Q; c% O8 [" y; z) ~; a}
0 W4 s; {7 N3 e  n( Y然后编译并执行这个程序,得到TAB.H文件。1 I  f. i3 `' j9 G5 Q
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:0 B$ k7 \* e  d2 j8 P
#include &lt;vcl.h&gt;
7 J2 x! n' t" h& J#pragma hdrstop, K, G/ K$ ^( d
#include "Unit1.h"
( M! \' e8 h9 d2 E& s3 _9 N; ?/ P#include"tab.h"//把头文件TAB.H包含在内7 u, J+ }6 L. d; ?1 K
//-----------------------------------------------------------------* L* _7 f( k' S% Z' K' t
#pragma package(smart_init)
8 F% w  @1 t! F, L# h#pragma resource "*.dfm"+ g8 Q- E8 h% |6 V; z
TForm1 *Form1;
3 S3 G) b9 v5 J//------------------------------------------------------------------
. d1 |5 c/ g) j3 ^, m! X* L5 R__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner): c9 l! Q; G/ T5 z5 V
{
: c3 e8 t- G6 ~7 u2 T7 F/ f}0 Y5 r3 @8 M& z/ E
//------------------------------------------------------------------$ q' C- l3 n8 U
void __fastcall TForm1::FormCreate(TObject *Sender)! S% m4 L4 I- O
{' R5 r6 ~8 E$ t* U* P
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定; e% O/ A4 ~4 C( Q" `3 y* a
}6 ?+ l; l: p: _3 p8 k& X
//-----------------------------------------------------------------' c6 Z+ A" n. r% B5 B: I# |
void __fastcall TForm1::Button1Click(TObject *Sender)
9 o3 A# q8 H$ u: @1 b2 h% A{( [6 c( m' }8 t0 Q/ p2 }
    unsigned long i,address;//把BIG5码转换为GB码) m5 {& `3 Z7 z5 [$ V! S% W1 u$ B
    unsigned char ch1,ch2;
. U+ ^3 E; W* ]7 c" O    char *x;) H& P7 f; f" M0 R( J
    x=RichEdit1-&gt;Lines-&gt;GetText();
* i  {. ?# k/ I8 Y7 [    i=0;! m+ T; F2 n! Z: _& m
    while(x!='\0')4 n- m# ?7 \  b/ p+ b" M
    {
* \1 a! u: f( v; e# u        ch1=x;
3 I2 M7 a7 i% @) ^  a( y8 ]        if(ch1&gt;=0xa1)+ P7 c3 T0 N! d% Y0 o
        {3 T8 w: H, Z6 U5 I) Z
            ch2=x[i+1];4 J+ u  q% b% s% o- o' n9 `! C) z1 s
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)! Q# ?- p8 ?) a4 O$ H  I
            {
) ]1 K, N5 m/ z: k                address=ch1*314+ch2*2-33010;
" S  L) X& z# @; |2 ^$ G- O                x=tab[address];
' H& W8 |- ]. |! C' x( o                x[i+1]=tab[address+1];+ l9 K! s9 B" ]) F8 x
            }  w7 v1 Y. {8 {& h  O" m, A
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)/ k, f7 ]/ I* G6 v- v, r% o
            {
( @$ F9 J% ]3 c) v% H                address=ch1*314+ch2*2-33078;2 h5 a( r8 [2 V, h
                x=tab[address];" u) t& h  Z6 b2 ]& R, Y' \* D
                x[i+1]=tab[address+1];
1 }5 c$ j% i0 V2 n" g- V: v            }) ]1 g/ V+ h1 K1 p: b; S7 B9 n0 ^
            i+=2;
3 `3 q3 k* L% n1 K- a8 C2 \        }
% C) D- b  Q( H$ q& S& K2 l; {        else
/ p! f- m  ?+ @        i++;
; ~# N/ M6 d1 X: z    }
4 G# e" F, o% f. c/ c2 N! ]' J    RichEdit1-&gt;Lines-&gt;Text=x;
# p6 c+ m0 l1 a5 j4 S# H" J5 y    RichEdit1-&gt;SetFocus();0 d5 Z( b* t" ]! v- }* W  @! M
    RichEdit1-&gt;SelStart = 0;, P# ]* v" K+ ~/ Y* p7 c
}
- q( a5 _4 j5 S. |2 @- ?0 K    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。5 e7 {1 x5 G. K4 b
</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-4-20 10:44 , Processed in 0.425424 second(s), 52 queries .

回顶部