时间: 2021-07-31 作者:daque
大师好,此刻的软硬件如: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; } 编写翻译并实行它,开始你会看到richedit第11中学的big5码文献表露为乱码。按一下button1,这时候,你就会看到richedit第11中学的乱码形成了平常的中国字。好了,此刻你本人编的软硬件也不妨扶助big5码了,是否发觉更专科少许。gb->big5的变换本领也是一致的,有爱好的伙伴不妨给我来函。结果,祝大师龙年欣喜。本步调在win97,bcb3.0下编写翻译经过