在GOOGLE中搜索汉字。比如“中国”,就会出现%E7%A0%B4%E8%A7%A3这些字符!
问了一下高手,说是UTF8编码,然后给了一段代码
function EncodeUTF8(var s:WideString):String; //
var i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]); //BCD转换
FmtStr(t,'%4.4X',[cur]);
Result:=Result+'0x'+t+';';
inc(i);
end;
end;可是我用这段代码根本不能把中文转成象GOOGLE中的那种数据,请教高手们
怎么转换?最好贴上代码!!谢谢!

解决方案 »

  1.   

    下载控件
    TntUnicodeControls.zip
    里面有个TntSystem的unit,直接使用其中的WideStringToStringEx(WideString,CP_UTF8);
    楼主之所以得不到想要的数据,我想应该是楼主使用的是AnsiString的中文字,即GBK编码,而非Unicode中文字,比如中华人民共和国GBK编码:"\xD6\xD0\xBB\xAA\xC8\xCB\xC3\xF1\xB9\xB2\xBA\xCD\xB9\xFA"
    Unicode:"\x4E2D\x534E\x4EBA\x6C11\x5171\x548C\x56FD"
    UTF8编码:"\xE4\xB8\xAD\xE5\x8D\x8E\xE4\xBA\xBA\xE6\xB0\x91\xE5\x85\xB1\xE5\x92\x8C\xE5\x9B\xBD"而这个utf8是由unicode编码而得来的,即由
    "\x4E2D\x534E\x4EBA\x6C11\x5171\x548C\x56FD"
    编制而得,但如果使用的是GBK编码的"中华人民共和国"当做Unicode,那么其十六进制字串就成为了
    "\xD6D0\xBBAA\xC8CB\xC3F1\xB9B2\xBACD\xB9FA"
    编制出来的UTF8编码就成了
    "\xED\x9B\x90\xEB\xAE\xAA\xEC\xA3\x8B\xEC\x8F\xB1\xEB\xA6\xB2\xEB\xAB\x8D\xEB\xA7\xBA"
    与实际所需要的相差甚远。PS:这里面使用的是C标准的十六进制表示方式,Delphi水平有限,实在不知道如何表示出来。尴尬ing.
      

  2.   

    唉呀呀,终于想到了,Delphi可以使用十进制来表示,重述一点点^_^
    --------------------------------------------------------------
    比如:'中华人民共和国'GBK编码: #214#208#187#170#200#203#195#241#185#178#186#205#185#250
    Unicode: #20013#21326#20154#27665#20849#21644#22269
    UTF8编码: #228#184#173#229#141#142#228#186#186#230#176#145#229#133#177#229#146#140#229#155#189而这个utf8是由unicode编码而得来的,即由
     #20013#21326#20154#27665#20849#21644#22269
    编制而得,但如果使用的是GBK编码的"中华人民共和国"当做Unicode,那么其十六进制字串就成为了
     #54992#48042#51403#50161#47538#47821#47610
    编制出来的UTF8编码就成了
     #237#155#144#235#174#170#236#163#139#236#143#177#235#166#178#235#171#141#235#167#186
    与实际所需要的相差甚远。
      

  3.   

    终于明白了GOOGLE的转换机制!但是在DELPHI中应该怎么转换呢?
    能帖个代码出来参考下吗?
    谢谢大大拉!
      

  4.   

    看看这个算不
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;type
            TCodePage=(cpThai,
                       cpJapan,
                       cpChineseSimplified,
                       cpKorean,
                       cpChineseTraditional,
                       cpUnicode,
                       cpEastEuropean,
                       cpCyrillic,
                       cpANSI,
                       cpGreek,
                       cpTurkish,
                       cpHebrew,
                       cpArabic,
                       cpBaltic,
                       cpKoreanJohab);
    const  CodePageIdentifiers:array[cpThai..cpKoreanJohab] of word
            =(874,
            932,
            936,
            949,
            950,
            1200,
            1250,
            1251,
            1252,
            1253,
            1254,
            1255,
            1256,
            1257,
            1361
            );
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(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[i]);
    s:=s+Copy(format('%X',[j+$100]),2,3);
    end;
    edit2.Text:=s;
    StringToWideChar(Edit1.Text,@(a[1]),500);
    s:='';
    i:=1;
    while((a[i]<>#0)or (a[i+1]<>#0)) do begin
    j:=Integer(a[i]);
    k:=Integer(a[i+1]);
    s:=s+Copy(Format('%X',[j*$100+k+$10000]),2,5);
    i:=i+2;
    end;
    edit3.Text :=s;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var
    ptmp:PWideChar;
    wlen:word;
    begin
    ptmp:=nil;
    wlen:=2*Length(Edit1.Text)+2;
    ReallocMem(ptmp,wlen);
    ZeroMemory(ptmp,wlen);
    MultiByteToWideChar(CodePageIdentifiers[cpChineseSimplified],
                            0,
                            pChar(Edit1.Text ),
                            Length(Edit1.Text),
                            ptmp,
                            wlen);
    Canvas.Font.color:=clBtnHighlight;
    TextOutw(Canvas.Handle,200,200,ptmp,LStrLenW(ptmp));
    Canvas.Font.Color:=clBtnShadow;
    if ptmp<>nil then begin
     FreeMem(ptmp);
     ptmp:=nil;
     end;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
    ptmp:PWideChar;
    wlen:word;
    begin
    ptmp:=nil;
    wlen:=2*Length(edit1.Text)+2;
    ReallocMem(ptmp,wlen);
    ZeroMemory(ptmp,wlen);
    StringToWideChar(edit1.Text,ptmp,wlen);
    Canvas.Font.Color:=clBtnHighlight;
    TextoutW(Canvas.Handle,200,200,ptmp,LStrLenW(ptmp));
    Canvas.Font.Color:=clBtnShadow;
    Caption:=WideCharToString(ptmp);
    if ptmp<>nil then begin
     freeMem(ptmp);
     ptmp:=nil;
     end;
    end;
    end.