QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码
6 Z5 h: |6 e% c% {7 S' m( x9 @陈寒秋</P>" ]- t! Q* H. L+ z) z8 g) U8 C, I
<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。2 }  @+ C/ {4 E( E. B- B4 N
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。- t& j+ m5 Z5 a
    第一步:找一个用于内码转换的码表文件。6 @" b- Q2 o, l( c# n* ^2 H6 k& q
    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
" V3 @7 Q5 I, P% H! \    第二步:把码表文件转换成数组文件。见下面的程序。
. ]( E- {' ~& ^+ I! d: a    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
/ l# x% K" G6 ~+ n9 d* Z2 v4 K6 O#pragma hdrstop  C- b9 s! T$ H2 C, H9 i
#include &lt;condefs.h&gt;
6 u" e4 M" k5 {9 u#include"stdio.h"
5 h. ]- T5 S$ h/ X5 L: E! U0 l#include"stdlib.h"0 K- U8 j9 B2 \. t4 t& F/ c4 n
#pragma argsused6 L- |2 ^) ?4 h$ L0 g
int main(int argc, char **argv)
- R; U2 L! X2 j$ R{) ]3 O8 k" f, F
    FILE *tab;1 N! a: R2 N' i, G
    FILE *hex;2 h8 E7 r% [& t9 S5 r2 y
    int i=0;. [6 s6 V: I- `8 r2 N
    unsigned int ch;% @) q$ z. z( e% c0 I& m6 t
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
2 J* ^7 ^5 m% w" h. t8 O    hex=fopen("tab.h","wb");
% ?1 _9 o- g7 Q    fputs("unsigned char tab[45840]={",hex);8 l) p' A* w5 N* S4 q6 s. T+ e; V0 g1 p
    fprintf(hex,"\n");: @4 P* l' p6 w" s- x, w
    for(i=0;i&lt;45840;i++), S$ G. s1 ]8 h
    {
9 B' j) q6 A$ F, U- I        if(i%20==0)
7 B4 C% f1 R" `7 T        {
9 d( I( z. Q+ r1 h' V: c            fprintf(hex,"\n");9 N% B1 _- U; D
        }
6 w8 x' r+ K9 ~6 e) t% H        ch=fgetc(tab);
' y- `" v9 Q# c        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件$ f- h# j; U* R. q$ @  I& [$ S
    }+ d# e1 G+ W9 d, I' Y' `
    fputs("0xff};",hex);
! C' |/ A% q& m; D& r. P6 W    fcloseall();' C1 L% }7 X% k( ?4 q: b9 y
    return 0;
8 Z: \, r9 v- r- {( _( H}
2 J+ ^, {7 o" y/ P  y( Y. c. r. J, S然后编译并执行这个程序,得到TAB.H文件。  j; L5 Y/ j* I# R. f4 I
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:8 f% L1 A' q, F8 J4 X
#include &lt;vcl.h&gt;
5 I' K3 R% g+ O0 S#pragma hdrstop
; T  w4 n: K$ A% b, n$ C' l#include "Unit1.h"
  T. p# A2 w9 S0 p" i#include"tab.h"//把头文件TAB.H包含在内6 J2 O2 k, ^0 F5 }& G# Q2 d1 y  v
//-----------------------------------------------------------------% ?! _  Q6 l/ G9 ^" z- P+ u) Z
#pragma package(smart_init)
7 f1 q/ o8 ~/ ~0 b#pragma resource "*.dfm"' y7 J2 b3 ]. D0 t
TForm1 *Form1;* X! U1 T0 N; D  X- _, ]: B
//------------------------------------------------------------------& _% c( U) e* z- Z
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)( W: F+ x2 R+ I3 o5 B
{
! `* y% R$ J- J* b}/ b# |0 z" H% Z, y, N, e- a
//------------------------------------------------------------------6 m. \; B* M; q# Q+ W/ @+ J
void __fastcall TForm1::FormCreate(TObject *Sender)
$ L( i7 ]" S/ k4 j+ l7 p# q{- a4 ?) m. W6 u& H/ L: J' q' i
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定( b9 G0 z% a9 ^* l
}
% h! B7 U# v4 M$ R//-----------------------------------------------------------------" `. H6 w" Z1 P5 P
void __fastcall TForm1::Button1Click(TObject *Sender): q9 T  W; `6 G6 r0 w+ f: o: Y& J
{
# p$ }* G" u5 r* S# H  T    unsigned long i,address;//把BIG5码转换为GB码2 {$ C0 t: u9 w8 W' f. ~) G# E
    unsigned char ch1,ch2;
; `. D- G6 g# [    char *x;* x% L9 j+ f! c
    x=RichEdit1-&gt;Lines-&gt;GetText();
. F; `" z, @0 D$ F+ C; d    i=0;; |9 ^- T* x0 w" e: `( v5 p3 o
    while(x!='\0')
4 t4 w8 P- ~* m- p( \! _    {' o3 `6 \, i, {) R
        ch1=x;
: z3 |  U1 P' N) l/ s        if(ch1&gt;=0xa1)# `+ _4 d; c5 P
        {8 }; H3 c' [6 v8 M
            ch2=x[i+1];5 d/ C+ n# l( ^7 Q9 _3 C$ N! [9 |0 k
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)) y5 w6 w4 {8 W& L
            {( e/ H) U4 t* w/ |; H# d
                address=ch1*314+ch2*2-33010;% ^9 w4 v& }+ L2 [/ p7 J
                x=tab[address];
" C' Q, v8 h6 v' w                x[i+1]=tab[address+1];
6 x$ n( ?0 W6 S7 c8 R  @2 u            }* N# o( f% o$ U8 \
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
7 }: w4 f% a& u3 z- A4 K9 H# X            {
+ c5 W0 p# o. Q. y1 c, y                address=ch1*314+ch2*2-33078;* x) u0 |  B; |- @7 h! C2 n$ s
                x=tab[address];: b% M5 q2 f/ n0 d0 t
                x[i+1]=tab[address+1];
' {& F6 g  t( E3 t5 y+ I            }9 n+ Q: ]& R$ \+ F9 t# r  A: m" {) a$ [
            i+=2;
& A, P' |& b% X  f9 W        }
8 j/ g+ t2 P' u2 T$ {& `0 |        else# a  p( M! Q1 N6 U! K" G' g$ o. t5 Q
        i++;
0 R% b! X0 f# {, O" @4 }/ P: G5 e    }3 e+ H! a, `! c4 @4 a$ Y
    RichEdit1-&gt;Lines-&gt;Text=x;
8 s* y% a* x' H    RichEdit1-&gt;SetFocus();6 }% J6 x; Z! Z( E0 Z# I
    RichEdit1-&gt;SelStart = 0;/ T  u2 q+ S, [7 ]0 I+ n+ r' \
}
. g- [. Y4 h8 R2 D, e  `1 A5 y    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
& m8 J7 {+ W; l0 p' D. z</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 12:58 , Processed in 0.430562 second(s), 52 queries .

回顶部