QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码9 Y+ c; \3 \+ b& |/ G
陈寒秋</P>
) D, f6 L2 z3 p8 x8 A' y<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
1 E# \+ c0 Z. T" B7 d& |% {* u/ ^2 w    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。8 l5 X3 F7 B5 [
    第一步:找一个用于内码转换的码表文件。9 l1 ]. X7 U( ]' R
    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
$ [% |+ c* \+ k$ w    第二步:把码表文件转换成数组文件。见下面的程序。$ H' X* E1 z( d9 P0 s. }. {& U/ m
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
7 @/ z+ Y5 ~; b" w/ N, E- s( z3 \#pragma hdrstop! s' d; ~  }' w' @
#include &lt;condefs.h&gt;
' [. E( a4 \9 ^  w! i# @. s#include"stdio.h"2 M. x" c. j8 }( K( E
#include"stdlib.h"# \# N+ Z7 c; o' F) y
#pragma argsused( k# V% P7 G3 a& @
int main(int argc, char **argv)* O" a( Q7 ^: w, c8 ?% `
{
. m0 ^/ z% ~4 R* p2 X/ l    FILE *tab;7 z9 H& V- ]5 {# ?% ~
    FILE *hex;
: J7 b- U# n+ w3 V    int i=0;) F# N  l: x$ x- D  E7 w  ~
    unsigned int ch;
+ k5 V! \$ t1 t    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
4 S& T$ \5 R4 G4 K! Y8 S    hex=fopen("tab.h","wb");
) v' c. [+ I& G6 N; |9 t4 i" ^    fputs("unsigned char tab[45840]={",hex);9 |4 X; j$ q4 D2 e$ j
    fprintf(hex,"\n");
' E" ?# K( I- x, @$ f* d    for(i=0;i&lt;45840;i++)
; `; C, \* W  B  {- }& r  |  P- r  O    {) Y/ C$ ~/ o% W, N. a9 a2 [2 R
        if(i%20==0)
! s/ n" Y& I8 a  }) B  f# d        {
( E+ \/ h* a% Q5 P6 ~! P            fprintf(hex,"\n");8 G+ d( r% [( Z2 m8 G
        }
" S0 O- P# N4 u3 l+ J8 c        ch=fgetc(tab);
' f, M' j$ Q6 ^6 I, G        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
+ e+ S+ o1 N. ?' A- n7 C    }
5 J; m0 W/ D5 Q, l    fputs("0xff};",hex);- |- ]% A( w, u5 n0 M9 _
    fcloseall();# L5 j4 i8 x& K/ a$ p
    return 0;
+ Q3 y/ g0 j2 b2 \) F! O2 a}+ \, f1 `; ?9 Y" J# g; j& ?! j
然后编译并执行这个程序,得到TAB.H文件。% p, J/ L0 \7 o- q% [" j+ L
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:9 f8 t" |$ h4 g7 |0 o% j$ ~9 H
#include &lt;vcl.h&gt;, t) q4 ~1 s) S9 t- T7 i
#pragma hdrstop
. k9 B. w5 N3 s2 |: B, `#include "Unit1.h"
) d5 ^$ k( h+ ^( m- _6 C  R6 J#include"tab.h"//把头文件TAB.H包含在内
$ g3 K: A/ _0 ]; ?//-----------------------------------------------------------------2 v# @; [0 j8 J5 b$ z
#pragma package(smart_init)
9 Q% \  C6 R/ L6 M#pragma resource "*.dfm"
6 e6 C! z& H4 }# y0 I! @) NTForm1 *Form1;" S# g) U& G0 m$ g4 A" F
//------------------------------------------------------------------
6 r. i( f- C9 R6 G- A7 j7 e2 ]__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)" j/ t  u3 C1 E: o9 R
{
# r! j& G- f6 e1 X/ \& J+ a}
3 t% r/ c9 W7 u8 U7 K- R7 c//------------------------------------------------------------------
' e0 e% q5 Y( tvoid __fastcall TForm1::FormCreate(TObject *Sender)
6 K4 X- a+ E9 J# \2 ]8 f. q( Z{
8 t  x3 d7 O; O' C6 f0 O5 c    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
; M4 U- [& U; S% E$ p, F  g7 C% `}, p  W  m8 P. k! q9 d! s
//-----------------------------------------------------------------
- l4 f# ?& [0 @: X$ [void __fastcall TForm1::Button1Click(TObject *Sender)
0 }( c  O3 N& _) ?6 J{' q/ B- @0 v! [4 {/ A1 y2 b
    unsigned long i,address;//把BIG5码转换为GB码2 U4 P) ^1 ?$ j1 H' J% e
    unsigned char ch1,ch2;
5 F2 M$ ~5 l5 `/ n  h5 B6 _    char *x;
$ L1 X+ ?4 v- D    x=RichEdit1-&gt;Lines-&gt;GetText();" ]+ \' z1 t: x* `, v8 F
    i=0;& ^: z, }/ x8 y4 L
    while(x!='\0')# \. @; i7 N) d' q8 u8 @" a+ F5 T
    {! m( J' H, Y, @  n4 q
        ch1=x;
1 g5 [, ]/ j8 }        if(ch1&gt;=0xa1)
3 A* ?4 K% m  f* r8 K; I        {
7 E1 ~  ?# x: @4 g7 w) U            ch2=x[i+1];4 O2 b6 B& N5 E% t
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)
) S( {. j; i& D3 N* S  X            {' x6 P! C( T! Q" q% F) {
                address=ch1*314+ch2*2-33010;
1 G  o& P: _, Z% l: R; n                x=tab[address];
8 f# O& r9 P6 t% j/ P4 g8 \                x[i+1]=tab[address+1];8 R* a, L+ p9 J4 n# s4 N9 H( @
            }. p5 ~8 C; T6 D/ S8 z2 }
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)! ^1 s9 T2 p+ x& D
            {
2 V- f( x) K! E& v0 |7 C, x                address=ch1*314+ch2*2-33078;
6 L0 z* b9 {' }3 w                x=tab[address];
6 M: ]5 n: D6 j8 v4 h) N                x[i+1]=tab[address+1];
6 S+ Y* M; b+ v7 A            }  D, a' @3 @5 c& e' r" }+ Y
            i+=2;( o, o9 F$ n5 G; A
        }! g- ?9 j9 s9 B4 r7 S# [
        else
8 Q; @" Q) ^+ ~4 r6 a2 s        i++;4 c$ a& t: l" ~" p# Y) K% j! _/ X
    }
$ P( i/ V9 \* G    RichEdit1-&gt;Lines-&gt;Text=x;
6 m- Q/ s# n1 f* v' s    RichEdit1-&gt;SetFocus();3 D3 w) e  K" T3 C  c. Y/ U/ ~
    RichEdit1-&gt;SelStart = 0;: v# I( O2 |  C$ V
}
, J& \& ~" m9 t& s* Y    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。3 o- y8 M( {4 m7 s" l
</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-6-11 03:36 , Processed in 0.390133 second(s), 51 queries .

回顶部