aska0419
一般會員
發表:4 回覆:2 積分:1 註冊:2003-05-17
發送簡訊給我
|
例如原本在memo中秀出來的是一串繁體字,現在我想把同樣的那段字改成簡體字秀出來,但是卻是亂碼,那該如何解決呢?? aska
------ aska
|
lcsboy
版主
發表:87 回覆:622 積分:394 註冊:2002-06-18
發送簡訊給我
|
就小弟的淺見, 你遇到的是兩個大問題, 不是一小個問題< > >
所以除非你的 >
>) 詳細的解法, 還望各位大大不吝提供< >
|
arnoyu
中階會員
發表:73 回覆:88 積分:67 註冊:2003-03-21
發送簡訊給我
|
我想,底下這篇跟你所要的技術類似,
你可以前往參考看看ㄅ.. http://www.powerba.com/develop/bcb/article/20000806006.htm ===三人行必有我師焉===
|
axsoft
版主
發表:681 回覆:1056 積分:969 註冊:2002-03-13
發送簡訊給我
|
aska0419 您好:
試試這個元件的寫法
**************************************************************************************
* [翻文轉字]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:\borland\cbuilder4\Lib\dclusr40.bpk,也可以創建新包,例如
D:\Borland\CBuilder4\Projects\gb.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>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=='\r'||*inputtext=='\n')
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=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)<>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>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=='\r'||*inputtext=='\n')
inputtext ;
if((m=*inputtext)!=96||m=='\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>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>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=='\r'||*inputtext=='\n')
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=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)<>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);
}
}
//---------------------------------------------------------------------------
HAVE A NICE DAY FOR YOU
|
axsoft
版主
發表:681 回覆:1056 積分:969 註冊:2002-03-13
發送簡訊給我
|
aska0419 您好:
試試這個元件的寫法
**************************************************************************************
* [翻文轉字]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:\borland\cbuilder4\Lib\dclusr40.bpk,也可以創建新包,例如
D:\Borland\CBuilder4\Projects\gb.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>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=='\r'||*inputtext=='\n')
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=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)<>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>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=='\r'||*inputtext=='\n')
inputtext ;
if((m=*inputtext)!=96||m=='\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>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>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=='\r'||*inputtext=='\n')
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=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)<>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);
}
}
//---------------------------------------------------------------------------
HAVE A NICE DAY FOR YOU
|
anpino
版主
發表:31 回覆:477 積分:231 註冊:2003-01-02
發送簡訊給我
|
axsoft所提供的程式值得細讀。
但如果要用現成的話,
請參考:
http://delphi.ktop.com.tw/topic.php?topic_id=4239
這個元件可以完全轉換。
我的繁簡體介面都是用這個元件轉的。 -------------------------------
數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D
Programmers Guide
http://anpino.begin.8d8d.com
|