QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码+ l6 F# t* j& V' r" `, V, g2 M
陈寒秋</P>8 v2 Z6 i8 A- z) L5 h' U
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。" N- c+ W* E9 g3 @6 e6 R% P0 X
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。' [1 X, U0 y' ]% C- N
    第一步:找一个用于内码转换的码表文件。
( m4 h/ w% Z- y. I) C# d' n  [    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
" B. b$ u2 s( \) T# w    第二步:把码表文件转换成数组文件。见下面的程序。
/ S" {) K  v8 ^- T; @, j$ V+ G    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
! e1 A/ u' ~' B3 q#pragma hdrstop0 `8 p; \+ D4 D# Q
#include &lt;condefs.h&gt;
2 l7 y; }* O/ U1 S#include"stdio.h"; [2 q1 I9 S! ^! u/ Q* U, |1 ]
#include"stdlib.h"
, }9 t" `2 ~- k, z/ j* X5 L. ]#pragma argsused
/ X4 H# U) _. x7 ], R4 l, Sint main(int argc, char **argv)0 u& Z/ K7 z/ F0 K
{: A8 E5 X# K- [, G/ M$ E
    FILE *tab;
% _, n6 {0 V% `0 H/ i    FILE *hex;. V7 U0 f& `# ~: c# e
    int i=0;* [$ e' V  |: A# P+ _+ E. b
    unsigned int ch;
9 Y5 ~/ C8 l6 E: t+ w/ C* H. t    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件: X6 X* {+ [/ C% F  M
    hex=fopen("tab.h","wb");, G0 R) e. M2 A
    fputs("unsigned char tab[45840]={",hex);7 O- o: K) f1 }/ q
    fprintf(hex,"\n");1 d5 D0 V* R2 _* n
    for(i=0;i&lt;45840;i++), o, v% F" l4 b* J% Y2 l
    {# b! h1 l* L8 n7 @6 Q+ R' o/ B
        if(i%20==0)# F* q% h3 y' c2 O
        {% k8 @" n. Y0 b& w3 O. m2 _
            fprintf(hex,"\n");$ s2 d; L# H5 P/ b  z+ s
        }
6 [, _! ~- D& I$ z) n        ch=fgetc(tab);- r2 b) u$ d  H$ z# }/ k( b8 ^
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件6 k, b$ R% a8 b# l; G, ]/ E
    }
  S7 @! F7 m* b0 ?" j7 W3 U  K    fputs("0xff};",hex);' R+ r2 y5 T$ _( ~4 i$ Y. c
    fcloseall();. l5 Y- p. y  ^5 L
    return 0;" o. w" d0 O( O1 f4 T( ~
}
" a: W$ F& E0 c/ `/ z然后编译并执行这个程序,得到TAB.H文件。
, D/ A* w( b; J! J    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:" d2 C# _/ R$ m( X* b# N  y! U
#include &lt;vcl.h&gt;) A% g& M' X( O; {3 n
#pragma hdrstop
8 U1 E7 @7 z0 I6 P#include "Unit1.h". m7 i0 o& q1 z! O. c
#include"tab.h"//把头文件TAB.H包含在内
2 z% i- J& l  {+ X0 r# q//-----------------------------------------------------------------& B4 a2 i6 c1 v
#pragma package(smart_init)% _. f$ L1 z* i" [6 R- h3 f2 b1 m
#pragma resource "*.dfm"
: J3 ~2 M5 O! \& KTForm1 *Form1;* Q$ [+ @$ [( w/ K1 Z% S4 ^  H8 k
//------------------------------------------------------------------
3 x5 H9 l( x9 E2 Z) O* h__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner). N1 x# s+ M! u0 B2 ~7 Y/ i5 L
{. l. N# R, }# S' \7 m* e+ |
}: C6 }3 F0 [7 g( h! e0 y/ E
//------------------------------------------------------------------
. ]2 I: s1 g; p6 g% a' zvoid __fastcall TForm1::FormCreate(TObject *Sender)# i! A9 S5 ?9 G; k/ n
{
& o, z9 ~' ?' k; k+ g5 R% S    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
6 Z! l  m- A! S* y$ A}
- n. Y2 f! h2 N! p! H3 I0 f( i  d//-----------------------------------------------------------------; m0 |3 v$ M6 u! Y
void __fastcall TForm1::Button1Click(TObject *Sender)+ C3 D4 Y  k  ?1 X1 N( |; e
{- Z8 @$ S. C0 ^: k
    unsigned long i,address;//把BIG5码转换为GB码3 _& N* v. l" H
    unsigned char ch1,ch2;; F$ N% r# o# R) j  A& |1 L9 J
    char *x;$ X, l$ g  }  Y7 `6 E4 g, l; F
    x=RichEdit1-&gt;Lines-&gt;GetText();+ a% i; C5 V" M1 _
    i=0;# A) e8 I$ w9 k4 n1 w- Y8 @8 W  y; S1 x
    while(x!='\0')8 s2 b8 G, ]0 y
    {! p' U' i0 b& q4 i, O
        ch1=x;5 D& M3 L+ b7 {/ P; E
        if(ch1&gt;=0xa1)  w  \/ b8 q6 }5 W7 _  K9 r
        {
+ ^- p+ E3 n' z$ G9 _( `4 N            ch2=x[i+1];- \. Z9 e1 I) r3 T) k1 m- b6 _0 G
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)
, u0 H/ R8 I8 M# H# u- U            {
6 u  p7 y7 Y/ o" G2 Z) N0 v                address=ch1*314+ch2*2-33010;! ~, {6 F; T9 y. X7 k: k; s
                x=tab[address];& E; |5 Q) K" b, z* s
                x[i+1]=tab[address+1];
% n6 c" S3 f0 w6 k% s1 q5 G6 K            }6 g2 l8 g  d- n1 i5 h
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
' m0 D5 Q" q4 I            {
, R; _/ C+ B3 c6 ?                address=ch1*314+ch2*2-33078;( I6 f# ~- F9 N7 B" f9 |1 w9 T% V. W
                x=tab[address];% r& \2 ^7 V8 q6 q$ ~; L) b& a
                x[i+1]=tab[address+1];# a' l4 J: y7 E9 x: C4 P1 G
            }& j5 I6 Y7 F+ }( y) q
            i+=2;' d4 X- h, K0 B
        }
5 t7 C9 `. I4 M# s        else$ m4 [/ I7 i2 B% t2 S
        i++;
- n% |1 J8 I; y1 ?# [    }
8 [& C3 s! D/ M" U# w+ ~9 M) k1 h    RichEdit1-&gt;Lines-&gt;Text=x;
3 g, Y. ?5 i( C9 w2 D5 z    RichEdit1-&gt;SetFocus();2 o% Q4 f: ^# O/ R2 m; D
    RichEdit1-&gt;SelStart = 0;
3 v; i, q2 _/ w  O; V' h}+ V8 g0 y2 p( h) }
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。% H7 g1 d& C0 m
</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, 2025-7-27 06:58 , Processed in 0.301516 second(s), 51 queries .

回顶部