手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

让TRichEdit支持BIG5内码

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文档中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就能够显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心他。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文档中保存的是汉字相应的GB编码,BIG5码文档中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文档,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文档时,就会产生常说的乱码现象。
由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就能够很容易让TRichEdit支持BIG5码了。
第一步:找一个用于内码转换的码表文档。
我用的是CCDOS97里带的CCDOS.TAB,这个文档的大小为45840个字节。假如您没有这个文档,能够给我来信(cnprogram@netease.com)我会寄一个给您。当然您还能够根据BIG5码的编码方案自己做一个,这里就不多说了。
第二步:把码表文档转换成数组文档。见下面的程式。
用BCB建立一个控制台应用程式。把他存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:
#pragma hdrstop
#include <condefs.h>
#include"stdio.h"
#include"stdlib.h"
#pragma argsused
int main(int argc, char **argv)
{
FILE *tab;
FILE *hex;
int i=0;
unsigned int ch;
tab=fopen("ccdos.tab","rb");//打开CCDOS.TAB文档
hex=fopen("tab.h","wb");
fputs("unsigned char tab[45840]={",hex);
fprintf(hex,"\n");
for(i=0;i<45840;i )
{
if(i ==0)
{
fprintf(hex,"\n");
}
ch=fgetc(tab);
fprintf(hex,"0x%x\x2c",ch);//把码表文档转换为数组文档
}
fputs("0xff};",hex);
fcloseall();
return 0;
}
然后编译并执行这个程式,得到TAB.H文档。
第三步:在BCB3.0中新建一个标准的应用程式。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整他们的大小和位置。然后在Unit1.cpp中添加下面的代码:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include"tab.h"//把头文档TAB.H包含在内
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5码的文档,可自己的情况设定
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned long i,address;//把BIG5码转换为GB码
unsigned char ch1,ch2;
char *x;
x=RichEdit1->Lines->GetText();
i=0;
while(x[i]!='\0')
{
ch1=x[i];
if(ch1>=0xa1)
{
ch2=x[i 1];
if(ch2>=0x40&&ch2<=0x7e)
{
address=ch1*314 ch2*2-33010;
x[i]=tab[address];
x[i 1]=tab[address 1];
}
if(ch2>=0xa1&&ch2<=0xfe)
{
address=ch1*314 ch2*2-33078;
x[i]=tab[address];
x[i 1]=tab[address 1];
}
i =2;
}
else
i ;
}
RichEdit1->Lines->Text=x;
RichEdit1->SetFocus();
RichEdit1->SelStart = 0;
}
编译并执行他,首先您会看到RichEdit1中的BIG5码文档显示为乱码。按一下Button1,这时,您就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在您自己编的软件也能够支持BIG5码了,是不是感觉更专业一些。GB->BIG5的转换方法也是类似的,有兴趣的朋友能够给我来信。最后,祝大家龙年愉快。本程式在WIN97,BCB3.0下编译通过。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS