gdufo

 

繁体与简体转换

unit   GB2BIG;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes;  
   
  const  
      GBfirst     =   $A1A1;   //   first   code   of   GB   */  
      GBlast       =   $FEFE;   //last   code   of   GB   */  
      GBsize       =   $5E5E;   //   GBlast   -   GBfirst   +   1   */  
  type  
      TGB2BIG   =   class(TComponent)  
      private  
          {   Private   declarations   }  
          Instance:   THandle;  
          GBTAB,   DupCode,   DupData:   TResourceStream;  
      protected  
          {   Protected   declarations   }  
      public  
          {   Public   declarations   }  
          function   GBtoBIG5(S:   string):   string;  
          function   GetBIGS(S:   string):   string;  
          constructor   Create(AOwner:   TComponent);   override;  
          destructor   Destroy;   override;  
      published  
          {   Published   declarations   }  
      end;  
   
  procedure   Register;  
   
   
   
  implementation  
  {$R   GB2BIG32.res}  
   
  procedure   Register;  
  begin  
      RegisterComponents('代刚',   [TGB2BIG]);  
  end;  
  constructor   TGB2BIG.Create(AOwner:   TComponent);  
  begin  
      inherited   Create(AOwner);  
      if   Not(csDesigning   in   ComponentState)   then  
      begin  
      GBTAB   :=   TResourceStream.Create(Instance,   'GB2BIG',   RT_RCDATA);  
      DupCode   :=   TResourceStream.Create(Instance,   'DUPCODE',   RT_RCDATA);  
      DupData   :=   TResourceStream.Create(Instance,   'DUPDATA',   RT_RCDATA);  
      end;  
  end;  
   
  destructor   TGB2BIG.Destroy;  
  begin  
      GBTAB.free;  
      DupCode.free;  
      DupData.free;  
      inherited   Destroy;  
  end;  
   
  function   TGB2BIG.GetBIGS(S:   string):   string;  
  var  
      C     :   array[0..5]   of   Char;  
      W     :   PWordArray;  
      CA   :   array[0..2]   of   Char;  
      I     :   Integer;                          
      bak:   string;                            
  begin  
      bak   :=   '';  
      if   Byte(S[1])   >   $A0   then  
      begin  
          W   :=   @(C[0]);  
          C[2]   :=   S[1];  
          C[3]   :=   S[2];  
          C[5]   :=   S[1];  
          C[4]   :=   S[2];  
          W[2]   :=   W[2]   -   GBfirst;  
          GBTAB.Position   :=   W[2]   *   2;  
          GBTAB.read   (CA,   2);  
          CA[2]   :=   #0;  
          bak   :=   bak   +   StrPas(CA);  
          I   :=   0;  
          while   I   <   DupCode.Size   do  
          begin  
              DupCode.Position   :=   I;  
              DupCode.read   (C,   2);  
              if   W[0]   =   W[1]   then  
              begin  
                  DupData.Position   :=   I;  
                  DupData.read   (CA,   2);  
                  CA[2]   :=   #0;  
                  bak   :=   bak   +   CA;  
              end;  
              inc(I,   2);  
          end;  
      end;  
      Result   :=   bak;  
  end;  
   
  function   TGB2BIG.GBtoBIG5(S:   string):   string;  
  var  
      bak:   string;                            
      C     :   array[0..1]   of   Byte;  
      I     :   Integer;                          
      W     :   PWordArray;                    
      CA   :   array[0..2]   of   Char;  
  begin  
      bak   :=   '';  
      W   :=   @(C[0]);  
      I   :=   1;  
      while   I   <=   Length(S)   do  
      begin  
          C[1]   :=   Byte(S[I]);  
          if   C[1]   >   $A0   then  
          begin  
              inc(I,   1);  
              C[0]   :=   Byte(S[I]);  
              inc(I,   1);  
              W[0]   :=   W[0]   -   GBfirst;  
              GBTAB.Position   :=   W[0]   *   2;  
              GBTAB.read   (CA,   2);  
              CA[2]   :=   #0;  
              bak   :=   bak   +   StrPas(CA);  
          end  
          else  
          begin  
              bak   :=   bak   +   S[I];  
              inc(I,   1);  
          end;  
      end;  
      Result   :=   bak;  
  end;  
   
  end.  
   
   
   
   
   
  ////////////////////////////////  
   
   
   
   
  unit   BIG2GB;  
   
  interface  
   
  uses  
      Windows,   Classes,   Messages,   SysUtils;  
  const  
       
      BIGfirst   =   $A140;   //   first   code   of   BIG  
      BIGlast     =   $F9FE;   //   last   code   of   BIG    
      BIGsize     =   $58BF;   //   BIGlast   -   BIGfirst   +   1    
       
       
  type  
      TBIG2GB   =   class(TComponent)  
      private  
          {   Private   declarations   }  
          Instance   :   THandle;  
          BIGTAB   :   TResourceStream;  
      protected  
          {   Protected   declarations   }  
      public  
          {   Public   declarations   }  
          function   BIG5toGB(S:   string):   string;  
          constructor   Create(AOwner:   TComponent);   override;  
          destructor   Destroy;   override;  
      published  
          {   Published   declarations   }  
      end;  
       
  procedure   register;  
   
       
  implementation  
  {$R   BIG2GB32.res}  
  constructor   TBIG2GB.Create(AOwner:   TComponent);  
  begin  
      inherited   Create(AOwner);  
      if   Not(csDesigning   in   ComponentState)   then  
      begin  
      BIGTAB   :=   TResourceStream.Create(Instance,   'BIG2GB',   RT_RCDATA);  
       
      end;  
  end;  
   
  destructor   TBIG2GB.Destroy;  
  begin  
      BIGTAB.free;  
      inherited   Destroy;  
  end;  
   
   
  function   TBIG2GB.BIG5toGB(S:   string):   string;  
  var  
      bak       :   string;    
      C     :   array[0..1]   of   Byte;  
      I     :   Integer;                          
      W     :   PWordArray;                    
      CA   :   array[0..2]   of   Char;  
  begin  
      bak   :=   '';  
      I   :=   1;  
      w:=@(C[0]);  
      while   I   <=   Length(S)   do  
      begin  
          C[1]   :=   Byte(S[I]);  
          if   C[1]   >   $A0   then  
          begin  
              inc(I,   1);  
              C[0]   :=   byte(S[I]);  
              inc(I,   1);  
              W[0]   :=   W[0]   -   BIGfirst;  
              BigTAB.Position:=   W[0]*2;  
              BIGTAB.Read(CA,2);  
              CA[2]:=#0;  
              bak   :=   bak   +   StrPas(CA);  
          end  
          else  
          begin  
              bak   :=   bak   +   S[I];  
              inc(I,   1);  
          end;  
      end;  
      Result   :=   bak;  
  end;  
   
  procedure   register;  
  begin  
      RegisterComponents('代刚',[TBIG2GB]);  
  end;  
   
  end.  

posted on 2008-08-26 11:24 gdufo 阅读(521) 评论(1)  编辑  收藏 所属分类: 其它

评论

# re: 繁体与简体转换 2008-12-28 22:04 繁体

hao  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Hibernate

友情链接

搜索

最新评论

阅读排行榜

评论排行榜