QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码- i0 O# \9 S3 Y1 m
陈寒秋</P>
/ ?6 o( g7 S# [( a8 ^2 Q<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。! u! C. ~4 X- R  F1 Y! `( c+ N
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。% v. U) T. U$ T$ G# O& i
    第一步:找一个用于内码转换的码表文件。
4 Q0 f; }" R$ g9 E& l: h4 Y    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。' N( m+ W# f( V+ [6 l* F
    第二步:把码表文件转换成数组文件。见下面的程序。
# g2 V% n1 t4 I    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
# ~4 _) ^" |6 }% x7 U& r2 W) [#pragma hdrstop
+ ^/ P3 f& [! c7 p#include &lt;condefs.h&gt;
4 [& n- _& L) x2 Q- j9 W#include"stdio.h"
; U3 C# ]' C# o' f6 `3 J0 R#include"stdlib.h") i8 B! t% K, R' a$ V% Y
#pragma argsused
5 f( K. ]2 ]# W2 F2 eint main(int argc, char **argv)) k& ~3 I4 [7 K& F9 P5 _  p
{
/ A) [5 V3 p; H  C- ]: M; S- N/ t    FILE *tab;* p3 Q: v, F; F: G
    FILE *hex;( L+ b6 h" r5 l: x/ t6 A. x; }
    int i=0;- e' a6 {/ X& ?# m
    unsigned int ch;  z0 p- p" N. a* R+ K# V. \2 N
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
, }* v7 q$ ]3 [. V" o( b! ?    hex=fopen("tab.h","wb");1 P' n$ ?) v# ?! B# n, X
    fputs("unsigned char tab[45840]={",hex);! _8 l" j" Z7 z! U. q( \7 I" n
    fprintf(hex,"\n");! S" g- v' Y% b
    for(i=0;i&lt;45840;i++)
5 K9 a( k- e; D" x7 k    {
3 I7 ^, s. Y3 l" |1 \+ {6 C' \        if(i%20==0), o* W# s" r' l
        {
8 k1 ]5 b# K% S2 z1 j            fprintf(hex,"\n");# D; V2 a6 z! S
        }$ ^! c9 {, J7 Q8 O, w: z. g
        ch=fgetc(tab);* d' q, K% }* e8 |$ q* N
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
2 _5 x& w3 M: A" t! n) a    }/ a6 P' s4 g! K  m; x! G2 w- O
    fputs("0xff};",hex);
! g: \* _7 F3 a- \. f. I    fcloseall();
6 P; t6 `+ N7 W    return 0;
2 i: e  o& G' c. @, \% V. {}
9 {! v& d# G& c! E2 i然后编译并执行这个程序,得到TAB.H文件。
5 I. N$ Y1 r2 R1 B2 |7 \    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:) Q( p  [6 W' A; V  z9 m, e
#include &lt;vcl.h&gt;
) c7 ]/ J5 F0 b#pragma hdrstop7 k  x3 T( K; R' z# G1 f
#include "Unit1.h"6 h, }+ E; L! t  L: R
#include"tab.h"//把头文件TAB.H包含在内
3 M$ P/ V( z8 }8 d//-----------------------------------------------------------------
. X0 z, U+ k# l$ }#pragma package(smart_init)9 Z" @4 W1 q& ^, V
#pragma resource "*.dfm"
' Z8 ^( P9 \  h+ QTForm1 *Form1;6 b: v8 Q9 D$ C* Y7 G
//------------------------------------------------------------------8 o6 {& H6 O( y) V0 A9 T: \. b$ J
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
7 B+ y0 N) p3 b{
1 F; T5 B3 t' L9 Y}" |2 t/ d/ V' D2 }2 B
//------------------------------------------------------------------
7 B- c" Z6 k& c) H# [) k( bvoid __fastcall TForm1::FormCreate(TObject *Sender)
7 \5 U9 \6 @/ w( d- W{0 A* `6 o# l. Y1 a2 k, `2 J" `- F+ x% g
    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定' o# a. k2 u( u1 k
}, V/ ~# l0 [% d% i# F1 T2 R
//-----------------------------------------------------------------
9 }& Z: y# ~0 t6 T5 A7 ~5 d2 {$ Avoid __fastcall TForm1::Button1Click(TObject *Sender)* z* j' Q2 j* D" f* s
{9 W9 M" I9 @, K
    unsigned long i,address;//把BIG5码转换为GB码3 c1 U. V" B  f$ G
    unsigned char ch1,ch2;! F6 f7 s; M) w' l3 L5 W
    char *x;
- t7 S( Z7 E0 D7 P7 m% G& k    x=RichEdit1-&gt;Lines-&gt;GetText();' C3 {  k: H2 Q* g3 i
    i=0;3 e/ _: F  j& ?5 t
    while(x!='\0')
+ T4 s' r% e: P2 q+ m8 T9 N2 Y    {7 h# J# Q9 G+ k6 _% }4 u7 A4 f' [
        ch1=x;
' m5 E; u7 e6 o) c0 O        if(ch1&gt;=0xa1)$ D* y9 A: R# p; o  i9 _- X; O
        {& g- a( l/ v5 ~& E: d
            ch2=x[i+1];5 a  {6 `) \5 K: P
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)$ d8 X0 _& u5 x2 l/ ?! P! p
            {- q4 r6 h0 Q% S" i
                address=ch1*314+ch2*2-33010;
+ U$ g/ o5 `4 g! P# p# y; P                x=tab[address];1 R# v, Q$ Z6 v- Q# E7 w
                x[i+1]=tab[address+1];
0 x* q6 K, ^+ }- w. p* \            }4 I/ I" I9 @' f
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
) V) g6 W' j+ ?- h/ n* K; J. q8 K            {8 {5 W- U+ ^+ v) Z1 h
                address=ch1*314+ch2*2-33078;# I( @/ c  B' {; w6 y0 S# v7 Z
                x=tab[address];
. W- t* \% H9 k4 c1 a4 F                x[i+1]=tab[address+1];
4 x, _/ f  d3 [+ w+ Y. ]! T            }: }) u; f9 o- `3 a, V" r2 W
            i+=2;% ~' Z) f% I( U+ ^4 p: u2 w
        }4 M& B% P' [, d1 l/ B
        else* R! k$ H7 s$ _& Z; N% F
        i++;
+ |+ E0 ]: ^3 M% [    }
6 y- L: ?  i* F- z- s  g    RichEdit1-&gt;Lines-&gt;Text=x;% J5 B: ^( P" M9 r! @: X* w5 V' V
    RichEdit1-&gt;SetFocus();
3 L3 @: j8 Z9 O. j9 k    RichEdit1-&gt;SelStart = 0;5 Q3 c3 T' ]3 z  L) v
}+ X: r* ?6 b0 M2 i9 G( O+ f; O
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。5 `2 i0 E# E" [
</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-9-2 02:49 , Processed in 0.439124 second(s), 52 queries .

回顶部