-
c语言入门之BCB3.0中让TRichEdit支持BIG5内码
大家好,现在的软件如: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%20==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包含在内
file://---------------------------------------------------------------------
------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
file://---------------------------------------------------------------------
------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
file://---------------------------------------------------------------------
------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5
码的文件,可自己的情况设定
}
file://---------------------------------------------------------------------
------
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下编译通过
一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家
介绍一下这两种内码:大家都知道英文的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%20==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包含在内
file://---------------------------------------------------------------------
------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
file://---------------------------------------------------------------------
------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
file://---------------------------------------------------------------------
------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
RichEdit1->Lines->LoadFromFile("c:\\BIG5.TXT");//读取一个BIG5
码的文件,可自己的情况设定
}
file://---------------------------------------------------------------------
------
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下编译通过
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式