QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码. |% |) N& I  s9 q0 j1 W2 S
陈寒秋</P>
+ Q* G( v. Z8 _# A+ s0 a<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。  S$ I  ?+ U1 G. v+ b0 g' N
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。
6 m  d8 l+ J) h. {+ M4 j, z    第一步:找一个用于内码转换的码表文件。
' m3 @" A' U. H/ T9 r, P/ g; ^    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。' v( \9 x* j7 q) n
    第二步:把码表文件转换成数组文件。见下面的程序。0 L/ U( e3 O1 n% ]- C: m$ O. A
    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:" d' u) c) y: _4 E: K5 l
#pragma hdrstop
" f0 w) K6 b0 R) G# X$ N#include &lt;condefs.h&gt;
! X- k3 u8 ^% t; N' Q: |' a#include"stdio.h": c8 `& J0 j3 R( x2 Q
#include"stdlib.h"
" V5 i! U! {8 d, `& ^6 ~* v/ n( x0 W#pragma argsused
4 H8 K& J) B1 d+ v, N. ~int main(int argc, char **argv)
( @9 y- r: u3 `7 \( {! M! h' v6 T, k{
+ _( q, L, I5 J1 e4 X    FILE *tab;* g8 I5 Q9 t' O/ u' X8 n
    FILE *hex;
( W# ~7 {9 U( Z* E; E    int i=0;& ?! p4 Q4 C7 E
    unsigned int ch;
# {/ m- W5 m6 `( y) l% N    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件5 `/ c6 r- S) O4 E
    hex=fopen("tab.h","wb");
8 d2 |3 o9 n) s0 ]7 T% o    fputs("unsigned char tab[45840]={",hex);
* C( @9 E; i3 ?1 w    fprintf(hex,"\n");
; R) p0 j) C" B4 a" Y/ m! E' {$ M    for(i=0;i&lt;45840;i++)
' t. ^: A1 ?" I( E( V9 i6 N    {
8 L. c4 k, c8 q) {0 @; O        if(i%20==0)
& ?  M0 `' o: O1 e, z0 v( N8 r; i4 A        {
6 h" z3 r: F3 n) c, Y) c  `4 H            fprintf(hex,"\n");( w6 t! j$ o6 o) [$ I
        }
8 S7 {4 v, g0 Z4 f7 j        ch=fgetc(tab);6 R! D% p$ x" M( e' L- X4 b) e; w
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
" ~5 {4 O. h, A# n9 j  k    }
! f6 L- x' L3 O" V* P    fputs("0xff};",hex);
" n6 B& ~/ t3 J' h9 ^1 l) N( p( e    fcloseall();* J' v* @$ A' O* W. j4 y1 {
    return 0;& l/ X6 X- z# i+ i2 x" Z
}8 s! H/ q* Y- o& a, n0 _2 G: y8 \5 F
然后编译并执行这个程序,得到TAB.H文件。
  ^' w/ n- h) v    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
' u4 @- W( d; v; H#include &lt;vcl.h&gt;
, }# N$ z' g. {2 q- o# [1 ^#pragma hdrstop
4 {: W8 R( C5 C0 N- d#include "Unit1.h"
% |1 j; N) i0 B9 {& }#include"tab.h"//把头文件TAB.H包含在内
: Q( _) }/ D% n5 z: O7 I/ v6 m/ I//-----------------------------------------------------------------
( ~( P) ~( h  J( U- \2 q0 h+ a#pragma package(smart_init)$ o1 ~9 ]1 B4 w8 Y4 A( p
#pragma resource "*.dfm"* G$ t+ `5 I, v/ t
TForm1 *Form1;
+ Y) C( c# d0 `2 X7 X" S//------------------------------------------------------------------
3 x; R% d" \5 i; V__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
/ s% q+ S  |! a, n& Q{
' }  I9 n2 G+ J4 H/ r0 ~0 v4 @4 z}
* W! S' |6 i; Y; N; B4 D" E' s- W//------------------------------------------------------------------
, ~  w0 G4 ?9 Avoid __fastcall TForm1::FormCreate(TObject *Sender)" P6 u. i% S# P. Z
{
/ e! H/ t7 d, y* Z& M    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定, i% C! N. _8 i! j# F
}/ q' `! }0 k! }' ?9 U+ e: [% o
//-----------------------------------------------------------------& j+ i* B6 e! B
void __fastcall TForm1::Button1Click(TObject *Sender)
( w8 v( Z. v: Q! x% z4 g" V: g{
. x1 i3 z, S5 _' H/ |9 l    unsigned long i,address;//把BIG5码转换为GB码
" D) H1 }/ B5 y' u8 e, {5 j( i; z    unsigned char ch1,ch2;! l# g" b2 `/ Q8 M+ o
    char *x;
( D' b$ Z* S" v/ t    x=RichEdit1-&gt;Lines-&gt;GetText();7 I  f8 |1 ]* z8 `7 ]4 Y. c
    i=0;2 ^: B8 W% s  O" A
    while(x!='\0')" n- L& m! g3 j  s. p, J- W
    {
/ e( j1 c* ?( v" |        ch1=x;
7 a1 D! ]- D( e) h        if(ch1&gt;=0xa1)
1 @- d1 l% }! f. M$ Z# O        {
7 N  B3 U. s" ]" V9 L' n2 f3 G/ z            ch2=x[i+1];, t0 b& E$ [' E0 ?# M, [. O
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)) Q! Y! ~( ?" f+ ?" a3 Y
            {& p2 ^. R* V; J/ E! T5 ~$ e
                address=ch1*314+ch2*2-33010;
/ O# a, }! x& w0 i% l                x=tab[address];
  l, I+ e# h# K- F- U2 D                x[i+1]=tab[address+1];0 O! }* o7 P  ?1 J# \
            }
* k1 I! L7 }' A            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)
: D1 t4 c9 [+ Y" _4 a            {6 V- O4 m- I: X2 e  S& d6 |
                address=ch1*314+ch2*2-33078;
6 ^) n1 c' q9 {' h/ V                x=tab[address];
+ U* h) k" c& D' W7 t& H                x[i+1]=tab[address+1];* i2 ]( I1 D& g3 I- @
            }7 D4 I3 i  t' t9 l7 ~
            i+=2;
/ d: e0 C+ m8 f3 }$ \- n0 J        }
6 R7 B9 [5 l8 q: f) r; w        else6 e% ~$ E& u2 c) q. Q
        i++;
3 E2 f, O) w" s/ t    }4 b1 u5 I9 c; O2 ~9 ?7 @
    RichEdit1-&gt;Lines-&gt;Text=x;
+ R% O; ]+ S% O/ g4 w    RichEdit1-&gt;SetFocus();& r* T* k0 b4 c* e4 f; t% W
    RichEdit1-&gt;SelStart = 0;
* t$ J0 l6 g  x8 |3 d}8 S. V/ O! |! h$ F, w
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。6 q$ I# M: c  T8 E1 [
</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 17:59 , Processed in 0.432674 second(s), 53 queries .

回顶部