[翻文转字]C++ Builder控件版
**************************************************************************************
* [翻文转字]C++ Builder控件版 *
* V1.0 正式版 使用说明 *
* 2000-04-30 *
**************************************************************************************
版权说明:
-------------
作者:周鹏飞(莫高软件工作室)
Email: mogao@371.net
URL: http://mogao.126.com
教育网:http://home.gbsource.net/mogao
本控件为开放源代码的自由软件,版权由作者:周鹏飞和[莫高软件工作室]所有。
功能简介:
-------------
本控件主要作用是: 可编码和解码目前常见的各种乱码。有我在手,乱码不愁!
可以使汉字在Gb码、Big5码和HZ码和之间进行自由的转换。
可以把任意文字和文件转换为UUencode、XXencode、Base64
和QP码这四种在Email中常用的编码方案,同时还支持解码。
升级介绍:
-------------
V1.0正式版(2000-04-30) 增加三种在Email中常用的编码方案:UUencode、XXencode和Base64,
可以把任意文字和文件转换为这三种编码,同时还支持解码。
V1.0 beta(1999-12-05) 可以使汉字在Gb码、Big5码、HZ码和QP码之间进行自由的转换。
使用授权:
-------------
见License.txt文件。
使用环境:
-------------
本控件是用C++ Builder4.0开发而成,现在只能在C++ Builder4.0下使用,
BCB3因手头没有所以没法测试,请安装BCB3的朋友帮忙测试,谢谢。同时
For Delphi的版本、DLL版本和ActiveX版本也将在近期推出。
技术支持与反馈:
-------------
本控件为自由软件,不用注册但同样可以得到技术支持。假如您想得到本控件的技
术支持和更新通知,请访问我的Homepage,加入邮递列表或直接给我写信,Email的
主题(Subject)应写为:订阅邮件列表。
假如您对本控件有什么想法、建议或者您使用了本控件,请来信告知。谢谢您的支持。
使用说明:
-------------
1. [安装控件]
在BCB4的IDE中选择Component菜单下Install Component项,在Unit file name、
Package file name中指定“gbbig.cpp”文件的路径和所使用的包。包可以是已经
存在的,例如D:orlandcbuilder4Libdclusr40.bpk,也可以创建新包,例如
D:BorlandCBuilder4Projectsgb.bpk。单击OK,然后BCB会提示要编译,当编
译完成后单击Install。至此,控件安装成功,应能在构件面板[莫高软件]页上看
到控件图标,假如没有,选择Component菜单下Install Package项,单击Add,选
定刚才编译的.bpl文件(如gb.bpl),单击“确定”,单击OK。
2. [使用控件]
请先将下面3个文件
gbbig.h (控件头文件)
gbbig.res (控件资源文件)
gbbig.dcr (控件图标文件)
拷贝到和您的程序同一个目录下,然后您就可以象使用BCB自带的控件一样使用本
控件了^_^
3. [函数说明]
请参看源程序。
/*************************************************************************
* [翻文转字]C++ Builder控件版 *
* V1.0 正式版 *
* 2000-04-30 *
* *
*作者:周鹏飞(莫高软件工作室) *
*Email: mogao@371.net *
*URL: http://mogao.126.com *
*教育网:http://home.gbsource.net/mogao *
*本控件为开放源代码的自由软件,版权由作者:周鹏飞和[莫高软件工作室]所有。*
*************************************************************************/
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "GbBig.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TGbBig *)
{
new TGbBig(NULL);
}
//---------------------------------------------------------------------------
__fastcall TGbBig::TGbBig(TComponent* Owner)
: TComponent(Owner)
{
FInputText=NULL;
FOutputText=NULL;
temp=NULL;
FInput='\0';
FOutput='\0';
}
//---------------------------------------------------------------------------
__fastcall TGbBig::~TGbBig(void)
{
FInputText=NULL;
delete FOutputText;
FOutputText=NULL;
delete temp;
temp=NULL;
FInput='\0';
FOutput='\0';
}
//---------------------------------------------------------------------------
//编码函数
void __fastcall TGbBig::Encode(void)
{
if(FInputText)
{
delete FOutputText;
FOutputText=NULL;
switch(Code)
{
case 0 :
FOutputText=new char[Num+1];
Res=LoadResource(HInstance,FindResource(HInstance,"GB_BIG5","TEXT"));
FontLib=(char*)LockResource(Res);
GBToBig5();
break;
case 1 :
FOutputText=new char[Num+1];
Res=LoadResource(HInstance,FindResource(HInstance,"BIG5_GB","TEXT"));
FontLib=(char*)LockResource(Res);
Big5ToGb();
break;
case 2 :
FOutputText=new char[Num*3+1];
EncodeHZ();
break;
case 3 :
FOutputText=new char[Num+1];
DecodeHZ();
break;
case 4 :
FOutputText=new char[Num*3+1];
EncodeQP();
break;
case 5 :
FOutputText=new char[Num+1];
DecodeQP();
break;
case 6 :
FOutputText=new char[Num/57+Num*4/3+5];
EncodeBase64();
break;
case 7 :
FOutputText=new char[Num*3/4+1];
DecodeBase64();
break;
case 8 :
FOutputText=new char[Num*2/45+Num*4/3+5];
EncodeUue();
break;
case 9 :
FOutputText=new char[Num*3/4+1];
DecodeUue();
break;
case 10 :
FOutputText=new char[Num*2/45+Num*4/3+5];
EncodeXxe();
break;
case 11 :
FOutputText=new char[Num*3/4+1];
DecodeXxe();
break;
}
}
}
//---------------------------------------------------------------------------
//GB码转换为Big5码
void __fastcall TGbBig::GbToBig5(void)
{
unsigned char gx,gy,bx,by;
unsigned int xx,yy,i=0;
while((gx=*FInputText++)!='\0')
{
if(gx>=161)
{
gy=*FInputText++;
xx=(gx-161)*190;
yy=(gy-161)*2;
bx=*(FontLib+xx+yy);
by=*(FontLib+xx+yy+1);
if(gy<161) {bx=gx;by=gy;}
*(FOutputText+i)=bx;
i++;
*(FOutputText+i)=by;
i++;
}
else {*(FOutputText+i)=gx;i++;}
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//Big5码转换为GB码
void __fastcall TGbBig::Big5ToGb(void)
{
unsigned char gx,gy,bx,by;
unsigned int xx,yy,i=0;
while((bx=*FInputText++)!='\0')
{
if(bx>=161)
{
by=*FInputText++;
xx=(bx-161)*316;
if(by<=126) yy=(by-64)*2;
else yy=(by-98)*2;
gx=*(FontLib+xx+yy);
gy=*(FontLib+xx+yy+1);
if(by<64) {gx=bx;gy=by;}
*(FOutputText+i)=gx;
i++;
*(FOutputText+i)=gy;
i++;
}
else {*(FOutputText+i)=bx;i++;}
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//用HZ进行编码
void __fastcall TGbBig::EncodeHZ(void)
{
unsigned int x=0,i=0;
unsigned char hz;
while((hz=*FInputText++)!='\0')
{
if(hz>=161)
{
if(!x)
{
*(FOutputText+i)='~';
i++;
*(FOutputText+i)='{';
i++;
x=1;
}
else x=1;
*(FOutputText+i)=(char)(hz-128);
i++;
}
else
{
if(x)
{
*(FOutputText+i)='~';
i++;
*(FOutputText+i)='}';
i++;
x=0;
}
else x=0;
*(FOutputText+i)=hz;
i++;
}
}
if(x)
{
*(FOutputText+i)='~';
i++;
*(FOutputText+i)='}';
i++;
x=0;
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//对HZ进行解码
void __fastcall TGbBig::DecodeHZ(void)
{
unsigned i=0;
unsigned char hz;
while((hz=*FInputText++)!='\0')
{
loop2:
if(hz==126)
if((hz=*FInputText++)!='\0')
if(hz==123)
while((hz=*FInputText++)!='\0')
{
loop3:
if(hz==126)
{
if((hz=*FInputText++)!='\0')
if(hz==125) goto loop;
else {*(FOutputText+i)=(char)254;i++;goto loop3;}
}
else {*(FOutputText+i)=(char)(hz+128);i++;}
}
else {*(FOutputText+i)='~';i++;goto loop2;}
else {*(FOutputText+i)='~';i++;goto end;}
else {*(FOutputText+i)=hz;i++;}
loop:;
}
end:;
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//用QP进行编码
void __fastcall TGbBig::EncodeQP(void)
{
unsigned char first,second,sour;
unsigned int i=0;
while((sour=*FInputText++)!='\0')
{
if(sour==61)
{
*(FOutputText+i)='=';
i++;
*(FOutputText+i)='3';
i++;
*(FOutputText+i)='D';
i++;
}
else
{
if(sour>127)
{
first=sour>>4;
second=sour&15;
if(first>9) first+=55;
else first+=48;
if(second>9) second+=55;
else second+=48;
*(FOutputText+i)='=';
i++;
*(FOutputText+i)=first;
i++;
*(FOutputText+i)=second;
i++;
}
else {*(FOutputText+i)=sour;i++;}
}
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//对QP进行解码
void __fastcall TGbBig::DecodeQP(void)
{
unsigned char first,second,sour;
unsigned int i=0;
while((sour=*FInputText++)!='\0')
{
if(sour==61)
{
if((first=*FInputText++)=='\0') {*(FOutputText+i)=sour;i++;break;}
else if((first<48)((first>57)&&(first<65))(first>70))
{
*(FOutputText+i)=sour;
i++;
*(FOutputText+i)=first;
i++;
continue;
}
else if((second=*FInputText++)=='\0')
{
*(FOutputText+i)=sour;
i++;
*(FOutputText+i)=first;
i++;
break;
}
else if((second<48)((second>57)&&(second<65))(second>70))
{
*(FOutputText+i)=sour;
i++;
*(FOutputText+i)=first;
i++;
*(FOutputText+i)=second;
i++;
continue;
}
if(first>=65) first-=55;
else first-=48;
if(second>=65) second-=55;
else second-=48;
sour=NULL;
sour=first<<4;
sour=second;
}
*(FOutputText+i)=sour;
i++;
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//用Base64进行编码
void __fastcall TGbBig::EncodeBase64(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=57,n=57;
inputtext=FInputText;
sour=new char[57];
obje=new char[76];
while(m==57)
{
m=strlen(inputtext);
if(m<57)
{
if(m==0) break;
n=m;
strncpy(sour,inputtext,m);
if(n%3) n=n-n%3+3;
for(i=m;i *(sour+i)=NULL; } else { m=57; strncpy(sour,inputtext,m); } inputtext+=m; for(i=0;i Base64(sour+i*3,obje+i*4); strncpy(FOutputText+j,obje,n/3+m); //n/3*4-(n-m) j+=n/3+m; for(i=0;i<(n-m);i++,j++) *(FOutputText+j)='='; *(FOutputText+j++)=' '; } *(FOutputText+j)='\0'; FOutput=(AnsiString)FOutputText; delete []sour; delete []obje; } //--------------------------------------------------------------------------- void __fastcall TGbBig::Base64(unsigned char chasc[3],unsigned char chuue[4]) /* chasc:未编码的二进制代码 chuue:编码过的Base64代码 */ { unsigned int i,k=2; unsigned char t=NULL; for(i=0;i<3;i++) { *(chuue+i)=*(chasc+i)>>k; *(chuue+i)=t; t=*(chasc+i)<<(8-k); t>>=2; k+=2; } *(chuue+3)=*(chasc+2)&63; for(i=0;i<4;i++) if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65; else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71; else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4; else if(*(chuue+i)==62) *(chuue+i)=43; else if(*(chuue+i)==63) *(chuue+i)=47; } //--------------------------------------------------------------------------- //对Base64解码 void __fastcall TGbBig::DecodeBase64(void) { unsigned char *sour,*obje,*inputtext; unsigned int i,j=0,m=57,n=76; sour=new char[76]; obje=new char[57]; inputtext=FInputText; while(m==57) { while(*inputtext==' '*inputtext==' ') inputtext++; m=strlen(inputtext); if(m<76) { if(m==0) break; n=m; } m=n/4*3; strncpy(sour,inputtext,n); inputtext+=n; for(i=0;i unBase64(sour+i*4,obje+i*3); strncpy(FOutputText+j,obje,m); j+=m; } *(FOutputText+j)='\0'; FOutput=(AnsiString)FOutputText; delete []sour; delete []obje; } //--------------------------------------------------------------------------- /*Base64解码*/ void __fastcall TGbBig::unBase64(unsigned char chuue[4],unsigned char chasc[3]) /* chuue:未解码的Base64代码 chasc:解码过的二进制代码 */ { int i,k=2; unsigned char t=NULL; for(i=0;i<4;i++) if((*(chuue+i)>=65)&&(*(chuue+i)<=90)) *(chuue+i)-=65; else if((*(chuue+i)>=97)&&(*(chuue+i)<=122)) *(chuue+i)-=71; else if((*(chuue+i)>=48)&&(*(chuue+i)<=57)) *(chuue+i)+=4; else if(*(chuue+i)==43) *(chuue+i)=62; else if(*(chuue+i)==47) *(chuue+i)=63; else if(*(chuue+i)==61) *(chuue+i)=0; for(i=0;i<3;i++) { *(chasc+i)=*(chuue+i)< k+=2; t=*(chuue+i+1)>>8-k; *(chasc+i)=t; } } //--------------------------------------------------------------------------- //用UUenCode进行编码 void __fastcall TGbBig::EncodeUue(void) { unsigned char *sour,*obje,*inputtext; unsigned int i,j=0,m=45,n=45,num; inputtext=FInputText; sour=new char[45]; obje=new char[60]; while(m==45) { m=strlen(inputtext); if(m<45) { if(m==0) break; n=m; strncpy(sour,inputtext,m); if(n%3) n=n-n%3+3; for(i=m;i *(sour+i)=NULL; } else { m=45; strncpy(sour,inputtext,m); } inputtext+=m; for(i=0;i Uue(sour+i*3,obje+i*4); *(FOutputText+j++)=m+32; strncpy(FOutputText+j,obje,n/3*4); j+=n/3*4; *(FOutputText+j++)=' '; } *(FOutputText+j++)='`'; *(FOutputText+j++)=' '; *(FOutputText+j)='\0'; FOutput=(AnsiString)FOutputText; delete []sour; delete []obje; } //--------------------------------------------------------------------------- /*Uuencode编码*/ void __fastcall TGbBig::Uue(unsigned char chasc[3],unsigned char chuue[4]) /* chasc:未编码的二进制代码 chuue:编码过的Uue代码 */ { int i,k=2; unsigned char t=NULL; for(i=0;i<3;i++) { *(chuue+i)=*(chasc+i)>>k; *(chuue+i)=t; if(*(chuue+i)==NULL) *(chuue+i)+=96; else *(chuue+i)+=32; t=*(chasc+i)<<(8-k); t>>=2; k+=2; } *(chuue+3)=*(chasc+2)&63; if(*(chuue+3)==NULL) *(chuue+3)+=96; else *(chuue+3)+=32; } //--------------------------------------------------------------------------- //对UUenCode解码 void __fastcall TGbBig::DecodeUue(void) { unsigned char *sour,*obje,*inputtext; unsigned int i,j=0,m=45,n; sour=new char[60]; obje=new char[45]; inputtext=FInputText; while(m==45) { while(*inputtext==' '*inputtext==' ') inputtext++; if((m=*inputtext)!=96m=='\0') { n=m-32; m=n; inputtext++; } else break; if(n<45) { if(n%3) n=(n-n%3+3)/3*4; else n=n/3*4; } else n=n/3*4; strncpy(sour,inputtext,n); inputtext+=n; for(i=0;i unUue(sour+i*4,obje+i*3); strncpy(FOutputText+j,obje,m); j+=m; } *(FOutputText+j)='\0'; FOutput=(AnsiString)FOutputText; delete []sour; delete []obje; } //--------------------------------------------------------------------------- /*Uuencode解码*/ void __fastcall TGbBig::unUue(unsigned char chuue[4],unsigned char chasc[3]) /* chuue:未解码的Uue代码 chasc:解码过的二进制代码 */ { int i,k=2; unsigned char t=NULL; if(*chuue==96) *chuue=NULL; else *chuue-=32; for(i=0;i<3;i++) { *(chasc+i)=*(chuue+i)< k+=2; if(*(chuue+i+1)==96) *(chuue+i+1)=NULL; else *(chuue+i+1)-=32; t=*(chuue+i+1)>>8-k; *(chasc+i)=t; } } //--------------------------------------------------------------------------- //用XXenCode进行编码 void __fastcall TGbBig::EncodeXxe(void) { unsigned char *sour,*obje,*inputtext; unsigned int i,j=0,m=45,n=45; char set[]="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; inputtext=FInputText; sour=new char[45]; obje=new char[60]; while(m==45) { m=strlen(inputtext); if(m<45) { if(m==0) break; n=m; strncpy(sour,inputtext,m); if(n%3) n=n-n%3+3; for(i=m;i *(sour+i)=NULL; } else { m=45; strncpy(sour,inputtext,m); } inputtext+=m; for(i=0;i Xxe(sour+i*3,obje+i*4); *(FOutputText+j++)=set[m&63]; strncpy(FOutputText+j,obje,n/3*4); j+=n/3*4; *(FOutputText+j++)=' '; } *(FOutputText+j++)='+'; *(FOutputText+j++)=' '; *(FOutputText+j)='\0'; FOutput=(AnsiString)FOutputText; delete []sour; delete []obje; } //--------------------------------------------------------------------------- /*Xxencode编码*/ void __fastcall TGbBig::Xxe(unsigned char chasc[3],unsigned char chxxe[4]) /* chasc:未编码的二进制代码 chxxe:编码过的Xxe代码 */ { int i; char set[]="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; chxxe[0]=chasc[0]>>2; chxxe[1]=(chasc[0]<<4)&48(chasc[1]>>4)&15; chxxe[2]=(chasc[1]<<2)&60(chasc[2]>>6)&3; chxxe[3]=chasc[2]&63; for(i=0;i<4;i++) chxxe[i]=set[chxxe[i]]; /*查表*/ } /*需注重的是,Xxencode文件正文部分中每一行的第一个字母是:从源文件中实际 读取的字符数的ASCII值取后六位后用set[]查表得到的。*/ //--------------------------------------------------------------------------- //对XXenCode解码 void __fastcall TGbBig::DecodeXxe(void) { unsigned char *sour,*obje,*inputtext; unsigned int i,j=0,m=45,n; sour=new char[60]; obje=new char[45]; inputtext=FInputText; while(m==45) { while(*inputtext==' '*inputtext==' ') inputtext++; if((m=*inputtext)!='+'m=='\0') { n=set(m); m=n; inputtext++; } else break; if(n<45) { if(n%3) n=(n-n%3+3)/3*4; else n=n/3*4; } else n=n/3*4; strncpy(sour,inputtext,n); inputtext+=n; for(i=0;i unXxe(sour+i*4,obje+i*3); strncpy(FOutputText+j,obje,m); j+=m; } *(FOutputText+j)='\0'; FOutput=(AnsiString)FOutputText; delete []sour; delete []obje; } //--------------------------------------------------------------------------- /*Xxencode解码*/ unsigned char __fastcall TGbBig::set(unsigned char ch) /*查表函数*/ { if(ch==43) ch=0; else if(ch==45) ch=1; else if(ch>=48&&ch<=57) ch-=46; else if(ch>=65&&ch<=90) ch-=53; else if(ch>=97&&ch<=122) ch-=59; return ch; } //--------------------------------------------------------------------------- void __fastcall TGbBig::unXxe(unsigned char chxxe[4],unsigned char chasc[3]) /* chxxe:未解码的Xxe代码 chasc:解码过的二进制代码 */ { int k=2 ,i; unsigned char t; t=NULL; *chxxe=set(*chxxe); for(i=0;i<3;i++) { *(chxxe+i+1)=set(*(chxxe+i+1)); *(chasc+i)=*(chxxe+i)< k+=2; t=*(chxxe+i+1)>>8-k; *(chasc+i)=t; } } //--------------------------------------------------------------------------- void __fastcall TGbBig::Input(AnsiString FInput) { delete temp; temp=NULL; Num=FInput.Length(); FInputText=new char[Num+1]; strncpy(FInputText,FInput.c_str(),Num); FInputText[Num]='\0'; temp=FInputText; } //--------------------------------------------------------------------------- void __fastcall TGbBig::InputText(char* Text) { delete temp; temp=NULL; Num=StrLen(Text); FInputText=new char[Num+1]; strncpy(FInputText,Text,Num); FInputText[Num]='\0'; temp=FInputText; } //--------------------------------------------------------------------------- namespace Gbbig { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TGbBig)}; RegisterComponents("莫高软件", classes, 0); } } //---------------------------------------------------------------------------
- 上一篇:C++辨析系列谈
- 下一篇:CRC-16/CRC-32 程序代码





