QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码' K$ m0 [! z) K) L+ U; D) o
陈寒秋</P>
- z, }7 J1 \" q2 E+ f' K0 ~/ h<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
9 n/ g& ?; M; p- u+ T+ Y$ Z    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。$ S8 N0 N3 }7 O- y
    第一步:找一个用于内码转换的码表文件。
; G3 ^" K7 ^& m. ^/ c    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。2 T! w- J7 W- i  e- X, [1 b( R
    第二步:把码表文件转换成数组文件。见下面的程序。
) p/ V  L% D. V. g    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
! e2 N0 W& P- o( C" I/ R6 J#pragma hdrstop
& [- w! b8 z' C+ \#include &lt;condefs.h&gt;
) O4 ~. R( ^( G/ j#include"stdio.h"
6 {9 {0 ]3 j& W* B$ [#include"stdlib.h"
5 L% s1 A  R4 z7 l- d- _* }$ ]* h/ H  q#pragma argsused
" u$ n* S6 N& e( [6 P$ {% Hint main(int argc, char **argv)
7 g$ A: a: W' ~5 b; c. B" }0 i{4 C) S/ Y$ \/ U) l0 k
    FILE *tab;
1 h- q9 Q* {2 t2 g$ b# |    FILE *hex;2 k7 {, F, P: X
    int i=0;; y9 {/ c$ X# v+ F, }
    unsigned int ch;
$ F9 |6 k+ {4 U; e    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
0 H! f0 O  u. X) j, t  e5 V. P/ s  V* S    hex=fopen("tab.h","wb");
, V$ ]; m% y- q- A; O! X    fputs("unsigned char tab[45840]={",hex);5 r5 `  f& Z0 `8 x4 e2 G
    fprintf(hex,"\n");! `8 E+ f6 F2 X  k: F1 I( ?
    for(i=0;i&lt;45840;i++)# Q  J: u1 p. y( d
    {0 V  y  [. a3 X/ d' f) m
        if(i%20==0)
6 X" o" T. J8 A* r4 g; X' e        {
% B! R5 T# i2 J1 ?            fprintf(hex,"\n");2 t3 ^) ]% x0 z) D; a0 b1 N
        }
; P0 n, ], [' ?% W- }* t        ch=fgetc(tab);
' y; c9 Y8 l7 \! V        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件: U/ E: ?( @5 ~3 V
    }5 S# x3 z3 P& r: K8 I
    fputs("0xff};",hex);4 H* h* T. b) [0 J
    fcloseall();. T* i, E+ Y8 u) K. A4 A1 W( o% I
    return 0;
3 Q  K) C5 j7 g9 ?}8 l6 @4 C* ]& s! C9 C6 I
然后编译并执行这个程序,得到TAB.H文件。
( }  Q/ L, F( o" x. _9 r    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
; v) [0 h2 X1 {1 D: F. n8 M: C; ^#include &lt;vcl.h&gt;
2 h, [  l5 J. V#pragma hdrstop
% Q- \1 e6 F2 g" {5 G- B#include "Unit1.h"( ]+ O% x$ F! d0 f0 ^+ z
#include"tab.h"//把头文件TAB.H包含在内
3 U$ ~- t- F+ h0 I  h//-----------------------------------------------------------------$ K3 p, B( [& G4 c
#pragma package(smart_init)
# h) W% B. f; q#pragma resource "*.dfm"+ d: r* J. c! n
TForm1 *Form1;. _/ {+ n1 u, e9 T
//------------------------------------------------------------------
+ }* O' Q8 R' w* L. t* {__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
4 J* S3 j$ P- v8 c* r( Z: V{
5 k9 b2 A  P# _}
. |! K9 x# Y& d+ K! f# e8 ^//------------------------------------------------------------------2 H5 p, r$ D. s& G# w" `
void __fastcall TForm1::FormCreate(TObject *Sender)
, G( h( Y9 s: V5 G{' Q" X2 i" l  ?: x  c: {/ Y. M
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定. I- v" G; G) i+ M! W7 U
}1 S! ~, T! A$ i" `* G8 Z8 v' O
//-----------------------------------------------------------------  c, T: w+ ^% m
void __fastcall TForm1::Button1Click(TObject *Sender)
) J/ N, p7 J$ \3 m{
: a3 E+ [! g/ B    unsigned long i,address;//把BIG5码转换为GB码
/ }, J0 p: N$ W) b" l3 ^0 S    unsigned char ch1,ch2;
, b2 z$ R1 S( u, P+ @$ t    char *x;3 k/ f5 a" P5 d9 C" N
    x=RichEdit1-&gt;Lines-&gt;GetText();
  r, J. p, r+ |$ B9 G+ e    i=0;
7 t, n7 \  N5 t( k" ]    while(x!='\0')( x& S+ a- P( q+ H. x# l
    {8 |1 T6 J& _$ N5 t8 {
        ch1=x;- f* W  ^, {/ }" I& y" w
        if(ch1&gt;=0xa1)
& B8 J* v8 A& E: O/ K7 U/ f        {4 @, [- x. T, u) {0 T5 V, t
            ch2=x[i+1];
+ ?# L- M& W3 Z            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)
( G+ N4 L0 ?# b4 X' c, R            {
) J' B% N* i, f4 N3 Z! r4 N                address=ch1*314+ch2*2-33010;
1 X  X' g$ z. b; ?* s                x=tab[address];
: U7 {. p1 e1 D4 j. y                x[i+1]=tab[address+1];
! \; A# `. P* \% M            }, }* ~, w5 T9 L+ M: y; W8 w
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
! @/ G2 ~5 C: }+ U+ [: J$ c8 r* n            {* Z0 {8 |5 _$ u8 k
                address=ch1*314+ch2*2-33078;3 ~- L. K1 R( P
                x=tab[address];
4 f  t9 U2 \/ q& e. X" i) T                x[i+1]=tab[address+1];
: f# `3 x& S/ P% a            }
/ N  {  l/ i5 p7 n            i+=2;
( W: K; P3 Z, b. g! i, r        }
  d9 n+ e! H  a8 q* o7 d        else* O: c# J- s0 s& F* ?
        i++;) Z# `: Z1 i6 |" x/ y) v: |( ]& m
    }
* w$ X; \' o, a! K# J) f    RichEdit1-&gt;Lines-&gt;Text=x;- n  r; K9 t, B' o$ `# k
    RichEdit1-&gt;SetFocus();7 u7 `+ T5 u& I8 X
    RichEdit1-&gt;SelStart = 0;
: E4 m3 Z2 ?' C" d& H}
* X8 e/ @) g/ U. t( w& T% B    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。& Q' h: N0 O9 |* \: O( c
</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 01:56 , Processed in 0.291375 second(s), 52 queries .

回顶部