QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码) E3 a+ w* X; t) J# g
陈寒秋</P>
- V; w* ]3 p! e% Y& p3 _<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。
! L5 u/ n% X) i  P  {    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。: ?  C  M( I6 t
    第一步:找一个用于内码转换的码表文件。$ ?% w- A4 F9 M! `* N; P
    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。
% B/ o: V: T" Q8 D    第二步:把码表文件转换成数组文件。见下面的程序。
2 {+ s3 u2 i2 P0 y9 y' {    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
$ {/ F. Y" p' A+ }#pragma hdrstop& B, ?5 T" A9 e8 V' r/ |
#include &lt;condefs.h&gt;
& j% a$ i. h- C& G#include"stdio.h"
9 f" J. F: \# o& b#include"stdlib.h"
) @$ g. t3 I- r1 S- \- ~; T#pragma argsused
; [0 d2 P  Q7 O4 B1 P3 ^int main(int argc, char **argv)5 W+ R" `2 A% o$ {# l
{
( ?% l( p3 S3 |$ ^) Q6 z0 P    FILE *tab;+ e: M) E( Z$ j
    FILE *hex;3 c3 v; \" o( v9 z4 m
    int i=0;
5 w* w4 K* Q) d* a1 c    unsigned int ch;: Y, {; s8 y9 v
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
7 i% D" l8 @9 z8 f+ e$ O    hex=fopen("tab.h","wb");
( ?  m) Q0 @9 a0 I2 ~: N# R' x& y; b    fputs("unsigned char tab[45840]={",hex);+ u$ B, x7 T; ^
    fprintf(hex,"\n");0 `, l  l9 |# ]- M3 i. b* E' T
    for(i=0;i&lt;45840;i++)
. {2 T  u+ h$ m    {
5 U( m. V! G# O8 T7 ~2 V7 \9 S        if(i%20==0)+ c( [' i) {! H/ E
        {1 R) \' P. \6 Z' b% u
            fprintf(hex,"\n");
1 S- G! y3 l( {; b1 q4 h8 j        }
+ P, k# @# x. C( f        ch=fgetc(tab);1 r; G/ @8 O- F  u0 q% ]
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件5 R8 `+ i* ~' e: q
    }. X7 x: l  S- B+ h5 \
    fputs("0xff};",hex);
' U# n! x7 T8 z    fcloseall();
; H9 t9 H& z( v1 G  G- g* |    return 0;0 s) G8 @$ i& X# J, L
}
. a3 M  @7 `' M% v$ l, K3 z然后编译并执行这个程序,得到TAB.H文件。: G! i, `) F) l' i1 d- o2 E2 i. _
    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:2 C& J' N4 Y+ k1 ^" e
#include &lt;vcl.h&gt;" }9 C' y- a, V2 y. S
#pragma hdrstop
# M( Z1 _/ m$ }# G#include "Unit1.h"" N5 x2 }3 X0 E8 ]4 y/ [  n4 X! A) h
#include"tab.h"//把头文件TAB.H包含在内, v! Y% ]# C' r) ?, X( Z0 {# _
//-----------------------------------------------------------------+ k0 P& K( |! A) H! _3 V. y$ W
#pragma package(smart_init)% i  e7 y9 }/ W4 T* S% q7 W
#pragma resource "*.dfm"
4 a9 r3 V* y5 e" n5 b1 FTForm1 *Form1;
$ N  M7 J* \# {  U* D//------------------------------------------------------------------( K8 X8 {" M7 b3 e+ U/ [
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
, Q: H) \' x8 b4 i$ O. f8 v/ r' |9 f{, K: N2 [$ Q6 `- y' Q  `3 `
}' ]' @; g: c3 f
//------------------------------------------------------------------
' q3 j$ s! C8 xvoid __fastcall TForm1::FormCreate(TObject *Sender)
' D: X( G4 J$ `- j* `* S{
" H* \1 _' \3 u8 b    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定
" e! q/ w2 Z( W) p0 f}
* t. R' M* S8 c9 e) D//-----------------------------------------------------------------" m, }  F- N, y! h1 ^3 H# W
void __fastcall TForm1::Button1Click(TObject *Sender)
7 x' A. j& M) i# W+ f) e) y{# w* R& ]2 X* i
    unsigned long i,address;//把BIG5码转换为GB码0 ]4 \1 T) h5 j' n' G
    unsigned char ch1,ch2;
/ C7 b6 ~: v0 O8 f% A7 B7 q    char *x;) y% P- Q  _. w/ {9 u
    x=RichEdit1-&gt;Lines-&gt;GetText();* B/ [  e/ C' K; q/ X6 p
    i=0;
$ x4 n2 g6 b8 h3 ]: ^. F    while(x!='\0')
4 Q' C% Q- g) N* O+ e    {
& k( P# }  Q! ~4 }% o        ch1=x;
: x6 K, x0 Y4 P, E        if(ch1&gt;=0xa1)
1 j  X3 ~# G9 u$ A2 ~8 ^, w. v: P        {, e! k, Q5 }4 k, X1 q- R: J
            ch2=x[i+1];
7 e7 M( N" b  @: n8 g; f6 J! `            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)- D( W; Y$ P* `0 B0 J3 A8 ?. Y
            {1 Q" R- _) b" n& B0 V% {4 P
                address=ch1*314+ch2*2-33010;# C* F% A; h' P
                x=tab[address];( H+ f4 _+ ]# ?! m, V
                x[i+1]=tab[address+1];2 a% a" V* t) e0 S% @
            }7 V- h( D! m! C# o4 E# A
            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)1 e9 D& @# c- q
            {
5 G" X. Y; i( P2 r0 }6 s( b  z                address=ch1*314+ch2*2-33078;: k* s0 E& M% u& C
                x=tab[address];2 \% P& S2 F0 \, F# ^: n
                x[i+1]=tab[address+1];
' ]+ ^- d( o" ]  {7 ^! w+ {% [* O! J            }
2 C" j9 c9 K6 i+ g( B0 ]            i+=2;5 s# A9 y. B& L
        }. s3 ~1 \  |- b' M4 y
        else0 e  M  I2 a: j/ \. i( a  r
        i++;
8 P. A) R: k9 @1 r1 X1 \% g1 e' T    }. \- J* r9 r+ ^
    RichEdit1-&gt;Lines-&gt;Text=x;
& L! o* P+ ~- N7 W7 |    RichEdit1-&gt;SetFocus();/ w/ K# Z6 N5 X- v3 @7 K
    RichEdit1-&gt;SelStart = 0;
9 ~, D3 _' c6 q: Z# [}
: F; V5 n- R6 T  `2 v3 D5 C4 B    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
6 w( a' S8 ~9 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-4-20 05:14 , Processed in 0.305966 second(s), 51 queries .

回顶部