我这里有一个经过我校对的 BIG5->GB 的对照表,以及相关的计算方法。
GB-BIG5反向计算就可以了。如果需要,说一声。[email protected]

解决方案 »

  1.   

    unit GB2BIG;interfaceuses
      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;interfaceuses
      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.