big5内码:让TRichEdit支持BIG5内码



大家好现在软件Software如:Foxmail等软件Software都有显示GB内码和BIG5内码功能我经过段时间摸索发现了实现这种功能思路方法现在就来介绍给大家首先要给大家介绍下这两种内码:大家都知道英文ASCII码是用个字节来表示但中文文字数量太多所以只能用两个字节来表示实际上我们常见文本文件中保存就是每个汉字对应内码而汉字内码就是该汉字在中文字库中逻辑位置在中文字库中该逻辑位置存放了这个汉字图像信息有了这些图像信息就可以显示该汉字了当然在现在Windows中这个显示过程是由操作系统自动来完成我们不必去关心它但是由于些历史上原因汉字内码方案有两种我们大陆地区使用是GB码而台湾省却使用是BIG5码GB码文件中保存是汉字相应GB编码BIG5码文件中保存是汉字相应BIG5编码而两种内码又都对应于各自字库文件所以当我们使用GB内码简体中文Windows来看BIG5内码文件时就会产生常说乱码现象
由于我们是要显示BIG5码汉字所以再介绍下BIG5码编码方案:每个汉字由两个字节构成字节范围从0X81-0XFE第 2个字节范围分别为0X40-0X7E0XA1-0XFE好了知道了汉字显示原理和BIG5码编码方案就可以很容易让TRichEdit支持BIG5码了
步:找个用于内码转换码表文件
我用是CCDOS97里带CCDOS.TAB这个文件大小为45840个字节如果你没有这个文件可以给我来信([email protected])我会寄个给你当然你还可以根据BIG5码编码方案自己做这里就不多说了
第 2步:把码表文件转换成文件见下面
用BCB建立个控制台应用把它存为TABTOHEX.BPR和TABTOHEX.CPP然后在TABTOHEX.cpp中添加以下代码:
#pragma hdrstop
# <condefs.h>
#\"stdio.h\"
#\"stdlib.h\"
#pragma argsused
( argc, char **argv)
{
FILE *tab;
FILE *hex;
i=0;
unsigned ch;
tab=fopen(\"ccdos.tab\",\"rb\");//打开CCDOS.TAB文件
hex=fopen(\"tab.h\",\"wb\");
fputs(\"unsigned char tab[45840]={\",hex);
fprf(hex,\"\\n\");
for(i=0;i<45840;i)
{
(i%200)
{
fprf(hex,\"\\n\");
}
ch=fgetc(tab);
fprf(hex,\"0x%x\\x2c\",ch);//把码表文件转换为文件
}
fputs(\"0xff};\",hex);
fcloseall;
0;
}
然后编译并执行这个得到TAB.H文件
第 3步:在BCB3.0中新建个标准应用添加个TButton组件:Button1添加个TRichEdit组件:RichEdit1适当调整它们大小和位置然后在Unit1.cpp中添加下面代码:
# <vcl.h>
#pragma hdrstop
# \"Unit1.h\"
#\"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];
(ch1>=0xa1)
{
ch2=x[i+1];
(ch2>=0x40&&ch2<=0x7e)
{
address=ch1*314+ch2*2-33010;
x[i]=tab[address];
x[i+1]=tab[address+1];
}


(ch2>=0xa1&&ch2<=0xfe)
{
address=ch1*314+ch2*2-33078;
x[i]=tab[address];
x[i+1]=tab[address+1];
}
i2;
}

i;
}
RichEdit1->Lines->Text=x;
RichEdit1->SetFocus;
RichEdit1->SelStart = 0;
}
编译并执行它首先你会看到RichEdit1中BIG5码文件显示为乱码下Button1这时你就会看到RichEdit1中乱码变成了正常汉字好了现在你自己编软件Software也可以支持BIG5码了是不是感觉更专业GB->BIG5转换思路方法也是类似有兴趣朋友可以给我来信最后祝大家龙年愉快在WIN97BCB3.0下编译通过
Tags:  机内码 内码转换器 内码转换 big5内码

延伸阅读

最新评论

发表评论