怎样实现“GBK<==>Unicode”相互转换的算法?最好能不用查常数表的方法 (200分)

  • 主题发起人 主题发起人 龙啸九天
  • 开始时间 开始时间

龙啸九天

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样实现“GBK&lt;==&gt;Unicode”相互转换的算法?最好能不用查常数表的方法
 
我是调用api函数的
function AnsiToUnicode(Ansi: string):string;
var
s:string;
i:integer;
j,k:string[2];
a:array [1..1000] of char;
begin
s:='';
StringToWideChar(Ansi,@(a[1]),500);
i:=1;
while ((a&lt;&gt;#0) or (a[i+1]&lt;&gt;#0)) do begin
j:=IntToHex(Integer(a),2);
k:=IntToHex(Integer(a[i+1]),2);
s:=s+k+j;
i:=i+2;
end;
Result:=s;
end;
 
因为我要在嵌入式系统中实现算法,所以StringToWideChar()应该怎样实现呢?
不用查表的话,有没有可能?
 
好象没有可能
以前我们也是查文件的
预先写到文件里
然后在嵌入式系统中(dos类型)查文件
 
就是说,不是用delphi?
 
是啊,用查表的话笨点,难道不能找到转换的规律吗?
 
没有算法,只能查表。
 
把中文转换成Unicode字符

unit Unit1;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.Edit1Change(Sender: TObject);
var s: string;
i, j, k: integer;
a: array[1..1000] of char;
begin
s:='';
for i:=1 to Length(Edit1.Text) do begin
j:=Integer(Edit1.Text);
s:=s+Copy(Format('%X ',[j+$100]) ,2,3);
end;
Edit2.Text:=s;
StringToWideChar(Edit1.Text, @(a[1]), 500);
s:=''; i:=1;
while ((a&lt;&gt;#0) or (a[i+1]&lt;&gt;#0)) do begin
j:=Integer(a); k:=Integer(a[i+1]);
s:=s+Copy(Format('%X ',[j*$100+k+$10000]) ,2,5);
i:=i+2;
end;
Edit3.Text:=s;
end;

end.


反编码的函数

function ReadHex(AString:string):integer;
begin
Result:=StrToInt('$'+AString)
end;

function UnicodeToAnsi(Unicode: string):string;
var
s:string;
i:integer;
j,k:string[2];
begin
i:=1;
s:='';
while i&lt;Length(Unicode)+1 do begin
j:=Copy(Unicode,i+2,2);
k:=Copy(Unicode,i,2);
i:=i+4;
s:=s+Char(ReadHex(j))+Char(ReadHex(k));
end;
if s&lt;&gt;'' then
s:=WideCharToString(PWideChar(s+#0#0#0#0))
else
s:='';
Result:=s;
end;

 
接受答案了.
 
后退
顶部