在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中的那种数据,请教高手们
怎么转换?最好贴上代码!!谢谢!
问了一下高手,说是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中的那种数据,请教高手们
怎么转换?最好贴上代码!!谢谢!
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.
--------------------------------------------------------------
比如:'中华人民共和国'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
与实际所需要的相差甚远。
能帖个代码出来参考下吗?
谢谢大大拉!
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.