QQ登录

只需要一步,快速开始

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

BCB3.0中让TRichEdit支持BIG5内码

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:27 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>BCB3.0中让TRichEdit支持BIG5内码
7 l6 S. N- u6 o4 Y. D% H' b: h: R. W陈寒秋</P>
' r2 d  R- Q- Y! q& l<>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。8 ]& l- q# P$ u3 b* {4 x
    由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。) n; N! c2 R, M
    第一步:找一个用于内码转换的码表文件。
# U' j1 A  X0 e8 e# x1 n    我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href="mailtcnprogram@netease.com" target="_blank" >cnprogram@netease.com</A>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。- x5 n; v/ K- G9 k& n0 Y! o
    第二步:把码表文件转换成数组文件。见下面的程序。
; h9 W7 K: t5 b! i    用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
  M; v+ w; }+ S# P; A) U9 q#pragma hdrstop
( u1 V, Q, o  P. P6 E( r# G! q#include &lt;condefs.h&gt;
0 ]. s7 V) N7 |) {. k/ |#include"stdio.h"
+ M' r8 @! m7 I' A# J/ _#include"stdlib.h"
0 x* o5 x, f2 B( o$ B- ^#pragma argsused  j8 r" {- F6 H3 x
int main(int argc, char **argv)
! t( |; h# C- s3 D8 |{# s# @4 Z/ M  F$ a% {3 ?+ Y; X0 _
    FILE *tab;
1 \3 F* D2 O7 d, Z. i1 s    FILE *hex;, r* n; y( E: O
    int i=0;
" E  |$ y, Q1 ]! s. b% D    unsigned int ch;  ?; p4 R' u2 M4 ~2 h. n$ n+ k/ u
    tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文件
! d( h1 P4 M8 b) ?0 \1 `: r$ v    hex=fopen("tab.h","wb");
  k/ d: J8 s4 ?  S    fputs("unsigned char tab[45840]={",hex);
4 a8 z) Y* Z+ M    fprintf(hex,"\n");. a* `# X$ a5 n# a
    for(i=0;i&lt;45840;i++)1 h* V8 o8 I6 v4 l
    {. L  b8 N! `4 V
        if(i%20==0)
/ B+ D1 X. k* o/ c. M        {/ q/ D9 Z4 ^, m& D! V% P
            fprintf(hex,"\n");
9 u( P6 o8 j/ l. i& Y( Z! D        }
: Y8 z" C6 F9 v  t        ch=fgetc(tab);( ^2 J  W3 l" v* J0 \# m" ^
        fprintf(hex,"0x%x\x2c",ch);//把码表文件转换为数组文件
0 V  O0 Z! s9 w" Y' ?  q- @    }
; ]. h) F: Q2 L) I7 o    fputs("0xff};",hex);% Y# N' l2 U1 S7 W  q
    fcloseall();
* y- U( ?+ a  G/ S# q/ B    return 0;
( t3 L. v4 Y% Y, h5 z) T: G}
  F& N5 \0 j2 P然后编译并执行这个程序,得到TAB.H文件。
- _8 U* U+ ]5 W3 g0 Q1 X" P    第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:
; X% E; _0 J; I8 o/ g- P#include &lt;vcl.h&gt;; _8 r  p0 w7 f& p- ^, N
#pragma hdrstop
! ]9 G1 G0 E% `) X6 @#include "Unit1.h"0 A; @( s* p# v
#include"tab.h"//把头文件TAB.H包含在内
- P7 o, T, E% k//-----------------------------------------------------------------4 G% M+ _0 R7 [  }! X
#pragma package(smart_init)
. @: j# P$ b* _  q8 I! O- e#pragma resource "*.dfm"$ y; W- l4 A3 ~. ^# h8 p4 Y: n
TForm1 *Form1;
8 x" j- y& C2 J6 r- Y//------------------------------------------------------------------4 h# I8 P/ \4 @( i
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
7 |, ~, a8 i4 u5 `{
; |1 c% d% N' ^' `% G}4 t4 o; t/ E- o# I& B
//------------------------------------------------------------------; y2 h, E. U+ O" W; i8 [) a3 t
void __fastcall TForm1::FormCreate(TObject *Sender)5 q. D2 ^5 ~' O* x# {- f% v9 ^
{
7 [0 G/ p5 E. h8 \6 G$ K    RichEdit1-&gt;Lines-&gt;LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文件,可自己的情况设定, b( n. [# x% ], p) [! A* Q9 u
}
- G  M( t2 |2 R% j, i4 ^5 b//-----------------------------------------------------------------1 a; ]! q2 _- ~4 U1 w
void __fastcall TForm1::Button1Click(TObject *Sender)
% R7 s$ d' _& H) Q$ b{2 X$ E% C% A/ o6 W( i+ m
    unsigned long i,address;//把BIG5码转换为GB码
7 W5 G+ S# f. b5 Y    unsigned char ch1,ch2;
1 p! U1 _. Q9 b    char *x;
) h/ E( J2 R/ v) w' T    x=RichEdit1-&gt;Lines-&gt;GetText();
8 V* ^% i# O% C% F# T    i=0;
5 r" }- g( b3 K2 v9 W/ M4 V    while(x!='\0')+ A% r; K8 s. S5 s8 Y, s
    {7 O% t9 u; Y, N. c% |+ B) I. a" M2 B
        ch1=x;8 e' Q. x& p' Z) D# ]; M
        if(ch1&gt;=0xa1)# U* f; W+ E' w; e
        {
; {9 M  B& \/ a) a7 r- l" m            ch2=x[i+1];- x; ?6 b; F5 a) O/ |* t
            if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)2 V% c2 r3 B+ B3 w3 U" _
            {( w0 L- K; d; B2 |  x% ?
                address=ch1*314+ch2*2-33010;
- X8 e3 `) S: Q1 |                x=tab[address];2 N* l4 ~% Z& P8 t: T/ d: U
                x[i+1]=tab[address+1];, s$ P5 |7 T/ c0 W! u7 O
            }
1 k! m2 T' M" M" i& U            if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)1 j1 P4 e' a. @1 Y
            {: _. S/ [3 @' M5 {. d+ d! p6 |, {6 t
                address=ch1*314+ch2*2-33078;# I% {# f1 ~+ }. S" [- Q! Y3 m
                x=tab[address];
7 V6 B6 c9 f( o                x[i+1]=tab[address+1];6 `& [: w* V$ t9 s8 [7 `7 {8 K! q3 m4 v
            }
; {0 {9 ]. N! i4 d) i% q. _  b0 g            i+=2;
# O% _& m* T0 i" t2 S! p. j        }
5 A5 n7 c9 J4 d        else3 V$ }' k: [" ~/ X, h
        i++;
; c  d3 @$ W3 ~4 n2 y. j7 B3 W    }
& C, C. L7 M" G$ D/ s    RichEdit1-&gt;Lines-&gt;Text=x;5 Y' R! q# e5 n! i1 A. `
    RichEdit1-&gt;SetFocus();
. J# e. a5 H2 d    RichEdit1-&gt;SelStart = 0;. K: m: f' ^% X$ e$ w
}4 c8 ]* H( ]/ x1 d3 W
    编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。
- t. q5 n- s. Y' L</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-9-17 14:27 , Processed in 0.420831 second(s), 52 queries .

回顶部