全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1911
推到 Plurk!
推到 Facebook!

請問如何讓程式中顯示出來的繁體字變成簡體字?

尚未結案
aska0419
一般會員


發表:4
回覆:2
積分:1
註冊:2003-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-16 15:37:59 IP:140.116.xxx.xxx 未訂閱
例如原本在memo中秀出來的是一串繁體字,現在我想把同樣的那段字改成簡體字秀出來,但是卻是亂碼,那該如何解決呢?? aska
------
aska
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-16 16:50:03 IP:211.23.xxx.xxx 未訂閱
就小弟的淺見, 你遇到的是兩個大問題, 不是一小個問題< > > 所以除非你的 > >) 詳細的解法, 還望各位大大不吝提供< >
arnoyu
中階會員


發表:73
回覆:88
積分:67
註冊:2003-03-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-20 12:30:31 IP:61.56.xxx.xxx 未訂閱
我想,底下這篇跟你所要的技術類似, 你可以前往參考看看ㄅ.. http://www.powerba.com/develop/bcb/article/20000806006.htm ===三人行必有我師焉===
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-20 15:37:07 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-20 15:40:56 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-13 11:21:44 IP:218.32.xxx.xxx 未訂閱
axsoft所提供的程式值得細讀。 但如果要用現成的話, 請參考: http://delphi.ktop.com.tw/topic.php?topic_id=4239 這個元件可以完全轉換。 我的繁簡體介面都是用這個元件轉的。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com
系統時間:2024-05-12 13:52:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!