QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码
3 T9 H2 Y. v% e陈寒秋</P>/ N/ l( ~* w  v7 u% J1 j7 y9 x
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。1 E6 D7 x. r- A. M$ K" ?
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
9 a' t$ ^7 y; o$ b    第一步:找一个用于内码转换的码表文件。8 M; G1 Z3 D# f; O
    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
& I- E7 z, s4 ]7 s3 t, [$ E    第二步:把码表文件转换成数组文件。见下面的程序。$ x& K% S( F; j( _# J6 N5 t
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
( p/ U7 k  l# d% ?) p8 ~3 v#pragma hdrstop
6 Q# K4 ]+ J* _0 O, P, j2 C1 X7 {#include &lt;condefs.h&gt;/ W6 b4 ]: f6 J4 p
#include"stdio.h"" J0 _3 p  U& P3 A% J
#include"stdlib.h") V* ~5 f/ e) }( ~9 \
#pragma argsused
  }9 g. n/ z1 t  h3 S. \: Sint main(int argc, char **argv)
, |+ Q4 \/ \. Q7 I6 ~{
5 ]5 Q! j; u& ~2 m8 n. f# n    FILE *tab;
% T* R% X; q+ g* B5 B5 p- y% P" W    FILE *hex;
, _) a# h3 |) @9 \- n    int i=0;; m% Z% m3 v5 @+ G% {
    unsigned int ch;
* q' ?4 I+ ^* @4 o/ e    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
7 e( v1 o3 U7 @    hex=fopen("tab.h","wb");
; M7 i2 ~9 e; M5 z9 x5 u& _    fputs("unsigned char tab[45840]={",hex);
5 R: ~. f: n, U/ w    fprintf(hex,"\n");$ g1 C1 m; U3 ?% `+ y) Z4 R0 E' ^; ]
    for(i=0;i&lt;45840;i++)' @2 }) `# n+ |4 s+ l) y6 }
    {
+ P! L3 C9 h/ X) l( l" W7 l8 |        if(i%20==0)3 p2 y8 P. D0 K" ]$ O
        {8 Q# ]3 {5 k9 J" U% L: D
            fprintf(hex,"\n");
9 j2 D0 R7 }+ w# k8 |        }  K4 i1 q5 g8 s1 M: |* Z2 J- U
        ch=fgetc(tab);
2 c$ L* P' A( r# p$ Q        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件3 ^; @$ Z0 p; W8 T: ~- p4 c" X
    }( P* k2 P' g$ K% g$ m+ n: n+ G
    fputs("0xff};",hex);2 x+ ~# |' B" y" O
    fcloseall();! t% L/ c' O- j5 C
    return 0;( [* @! P' e- F' u- W: x
}
( x3 r; F7 T6 r$ ^$ n5 g4 Z& D然后编译并执行这个程序,得到TAB.H文件。- ]& l6 I8 h/ y# ?9 q2 }
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:+ E0 Z5 a! ^8 {3 A) S
#include &lt;vcl.h&gt;
% C% x$ J3 G4 V! A1 z2 r; L: i#pragma hdrstop3 _  Z. F  u1 V3 r
#include "Unit1.h"
; J* D& P, A) P+ B7 {' c6 v#include"tab.h"//把头文件TAB.H包含在内. n- E: Q6 J' t6 I2 k& l
//-----------------------------------------------------------------. J, F' R4 o: W, q
#pragma package(smart_init)
; `, I$ P5 ^1 B7 x. |4 V8 Y#pragma resource "*.dfm"9 \) ^  N+ N( U( \
TForm1 *Form1;
& C) |* Y7 _( o; J% y) ~//------------------------------------------------------------------  @$ i3 r  N0 m1 ~+ i/ ]
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
4 \6 s4 g( X1 T) j/ Y! e{$ ]6 d1 N  s7 `" a5 g( a+ A
}
- y' y1 O9 ?( |- L- n//------------------------------------------------------------------
6 l" a! R, C! wvoid __fastcall TForm1::FormCreate(TObject *Sender)7 @/ _- Y1 c7 ^5 h8 w+ H( ?  q
{
* l- ^: Q7 L, Z7 ~& l  ]6 x    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定% h& y5 H# d% R6 W4 N3 _" v
}
& t% P, s1 D) r; {//-----------------------------------------------------------------
* S( s, Q% z" A1 b* ?+ j2 Dvoid __fastcall TForm1::Button1Click(TObject *Sender). x( z" i2 N1 p* c  ^4 i
{
& U- D) a6 D( p! ~    unsigned long i,address;//把BIG5码转换为GB码
$ @! Z2 a( x1 D    unsigned char ch1,ch2;
' n; R1 h; v9 f5 o& n    char *x;6 Y  b. c5 ^, x" c* z% v, G
    x=RichEdit1-&gt;Lines-&gt;GetText();( f2 B$ t& h3 k) Y
    i=0;
4 e/ `& ~  }1 C* b1 p    while(x!='\0')2 J6 M) N+ q3 x8 t9 |3 L' Q7 G
    {6 F8 Y; m. r4 h* C& k* v
        ch1=x;; M( r8 Z# a1 S: `5 |
        if(ch1&gt;=0xa1)
$ j  z+ F" _& w% K4 r0 F        {
, N* ~3 e' A' ]' l2 u, {9 o1 j+ O8 m            ch2=x[i+1];
5 n: U# H, y8 C+ T! r/ q* [0 i; q            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e), c6 r; N# S8 b6 K+ W0 b5 v3 X& L5 o
            {- }- x) A% V( h; f" R4 |" }0 k5 w
                address=ch1*314+ch2*2-33010;: r' g. p9 i5 _% J
                x=tab[address];
  D" Y" \% y& v" S. W/ ]9 Y. `& T                x[i+1]=tab[address+1];8 N1 F- h2 l% R) T
            }
7 g" U% Z9 a0 A' s$ I            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
2 ]; n. P/ e5 T0 x            {& A2 d6 F8 W8 h' _7 U* w0 t: _8 n
                address=ch1*314+ch2*2-33078;
( c+ D$ R. t8 f9 F                x=tab[address];- f  a4 y' W( e. ]% N0 p
                x[i+1]=tab[address+1];
# A1 H; S5 K3 @( g' d            }, V1 |7 H5 c9 Z- l! s! [' i( m
            i+=2;  g) k1 H1 l6 C6 A9 D7 ?4 X+ i
        }* t" O) y4 G& a3 T# q8 j
        else
5 ^$ u8 S! S( m        i++;/ k! P* \+ a7 \- r2 f
    }
$ m$ F; s) V: Z# E+ L2 d" w! n    RichEdit1-&gt;Lines-&gt;Text=x;' x3 l2 p2 g$ h2 ?% |. {' Y  @
    RichEdit1-&gt;SetFocus();
# X4 t- N# ]+ j    RichEdit1-&gt;SelStart = 0;
8 E. H- f) N- [! F5 i% R3 F- E6 M}
. f7 O7 a5 a0 s6 X: q1 ]& }    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。7 H+ G$ o9 w8 W$ |# s  U& F
</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-20 15:01 , Processed in 0.630023 second(s), 52 queries .

回顶部