我做了一个转换内码的DLL,但感觉不爽,要用码表的转换,所以想直接用程序转换,我想这也不难吧?

解决方案 »

  1.   

    Bob7946(X度空间) 能不能发给我看看。
    [email protected]
      

  2.   

    unit Unit1;interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        
      private
        { Private declarations }
      public    { Public declarations }
      end;var
      Form1: TForm1;
      function GBtoBIG5(value: string): string;
      function BIG5toGB(value: string): string;implementation{$R *.DFM}
    var
      BIG5Order: array[0..14757] of Word;
      GBOrder  : array[0..8177] of Word;function GBOffset(value: string): integer;
    begin
      if length(value) >= 2 then
        Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
      else
        Result := -1;
    end;function BIG5Offset(value: string): integer;
    begin
      Result := -1;
      if length(value) >= 2 then
      begin
        if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
          Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
        if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
          Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
      end
    end;function WordToString(value: Word): string;
    begin
      Result := Chr(Hi(value)) + Chr(Lo(Value));
    end;function isBIG5(value: string): Boolean;
    begin
      if (length(value)>=2) then
      begin
      if (value[1] < #161) then
        Result := false
      else
        if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
          Result := true
        else
          Result := false
      end
      else
        Result := false
    end;function isGB(value: string): Boolean;
    begin
      if (length(value)>=2) then
      begin
        if (value[1] <= #161) and (value[1] >= #247) then
          Result := false
        else
          if (value[2] <= #161) and (value[2] >= #254) then
            Result := false
          else
            Result := true
      end
      else
        Result := true;
    end;function GBtoBIG5(value: string): string;
    var
      leng, idx      : integer;
      tmpStr        : string[2];
      Offset        : integer;
      output        : string;
    begin
      output := '';
      leng := length(value);
      idx := 1;
      while idx <= leng do
      begin
        tmpStr := value[idx]+ value[idx + 1];
        if isGB(tmpStr) then
        begin
          offset:=GBOffset(tmpStr);
          if (offset >= 0) and (offset <= 8177) then
          begin
            output := output + WordToString(GBOrder[offset]);
            inc(idx);
          end
          else
            output := output + value[idx] ;
        end
        else
          output := output + value[idx] ;    inc(idx, 1);
      end;
      Result := output;
    end;function BIG5toGB(value: string): string;
    var
      leng, idx      : integer;
      tmpStr        : string[2];
      output        : string;
      offset        : integer;
    begin
      output := '';
      leng := length(value);
      idx := 1;
      while idx <= leng do
      begin
        tmpStr := value[idx]+ value[idx + 1];
        if isBIG5(tmpStr) then
        begin
          offset:=BIG5Offset(tmpStr);
          if (offset >= 0) and (offset <= 14757) then
          begin
            output := output + WordToString(BIG5Order[offset]);
            inc(idx);
          end
          else
            output := output + value[idx];
        end
        else
          output := output + value[idx];    inc(idx);
      end;
      Result := output;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    label1.caption:=big5togb(edit1.text);
    end;end.
      

  3.   

    // GB2312/BIG5 convert unit for Delphi 3
    // ver 1.01
    unit CVCode;interface
     function GBtoBIG5(value: string): string;
     function BIG5toGB(value: string): string;implementationvar
      BIG5Order: array[0..14757] of Word;
      GBOrder  : array[0..8177] of Word;function GBOffset(value: string): integer;
    begin
      if length(value) >= 2 then
        Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
      else
        Result := -1;
    end;function BIG5Offset(value: string): integer;
    begin
      Result := -1;
      if length(value) >= 2 then
      begin
        if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
          Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
        if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
          Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
      end
    end;function WordToString(value: Word): string;
    begin
      Result := Chr(Hi(value)) + Chr(Lo(Value));
    end;function isBIG5(value: string): Boolean;
    begin
      if (length(value)>=2) then
      begin
       if (value[1] < #161) then
         Result := false
       else
         if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
           Result := true
         else
           Result := false
      end
      else
        Result := false
    end;function isGB(value: string): Boolean;
    begin
      if (length(value)>=2) then
      begin
        if (value[1] <= #161) and (value[1] >= #247) then
          Result := false
        else
          if (value[2] <= #161) and (value[2] >= #254) then
            Result := false
          else
            Result := true
      end
      else
        Result := true;
    end;function GBtoBIG5(value: string): string;
    var
      leng, idx      : integer;
      tmpStr         : string[2];
      Offset         : integer;
      output         : string;
    begin
      output := '';
      leng := length(value);
      idx := 1;
      while idx <= leng do
      begin
        tmpStr := value[idx]+ value[idx + 1];
        if isGB(tmpStr) then
        begin
          offset:=GBOffset(tmpStr);
          if (offset >= 0) and (offset <= 8177) then
          begin
            output := output + WordToString(GBOrder[offset]);
            inc(idx);
          end
          else
            output := output + value[idx] ;
        end
        else
          output := output + value[idx] ;    inc(idx, 1);
      end;
      Result := output;
    end;function BIG5toGB(value: string): string;
    var
      leng, idx      : integer;
      tmpStr         : string[2];
      output         : string;
      offset         : integer;
    begin
      output := '';
      leng := length(value);
      idx := 1;
      while idx <= leng do
      begin
        tmpStr := value[idx]+ value[idx + 1];
        if isBIG5(tmpStr) then
        begin
          offset:=BIG5Offset(tmpStr);
          if (offset >= 0) and (offset <= 14757) then
          begin
            output := output + WordToString(BIG5Order[offset]);
            inc(idx);
          end
          else
            output := output + value[idx];
        end
        else
          output := output + value[idx];    inc(idx);
      end;
      Result := output;
    end;initialization  BIG5Order[0] := $2020;
      BIG5Order[1] := $A3AC;
      BIG5Order[2] := $A1A2;
      BIG5Order[3] := $A1A3;
      BIG5Order[4] := $2020;
    .......
      GBOrder[8168] := $F876;
      GBOrder[8169] := $C566;
      GBOrder[8170] := $EFB4;
      GBOrder[8171] := $C35E;
      GBOrder[8172] := $C4D3;
      GBOrder[8173] := $C5C4;
      GBOrder[8174] := $F87B;
      GBOrder[8175] := $ECB8;
      GBOrder[8176] := $C24D;
      GBOrder[8177] := $2020;
      GBOrder[8177] := $2020;  
    end.
      

  4.   

    好像在Win2000里面,可以直接支持了,利用系统的Unicode可以转换,代码没有
      

  5.   

    to afeisky(刀光剑影(离开xkx@MUD的日子)): 你也是用的查表法丫!
      

  6.   

    to LWWL(武):你的办法也不行,一样是用的查表法