Delphi7及其以下版本的 VCL 只支持 Ansi,
所以在使用WideString 与 UTF8String (定义与 AnsiString 相同) 并没有办法正确的在 VCL 中显示
Delphi7自带的utf-8转换函数遇到其无法识别的字符串就返回空。
新建一个util_utf8.pas,然后引用这个
转换函数可以解决这个bug
unit
util_utf8;
interface
uses
Windows;
type
UTF8String =
AnsiString
;
function
AnsiToWide(
const
S:
AnsiString
):
WideString
;
function
WideToUTF8(
const
WS:
WideString
): UTF8String;
function
AnsiToUTF8(
const
S:
AnsiString
): UTF8String;
function
UTF8ToWide(
const
US: UTF8String):
WideString
;
function
WideToAnsi(
const
WS:
WideString
):
AnsiString
;
function
UTF8ToAnsi(
const
S: UTF8String):
AnsiString
;
implementation
function
AnsiToWide(
const
S:
AnsiString
):
WideString
;
var
len:
integer
;
ws:
WideString
;
begin
Result:=
''
;
if
(Length(S) =
0
)
then
exit;
len:=MultiByteToWideChar(CP_ACP,
0
,
PChar
(s), -
1
,
nil
,
0
);
SetLength(ws, len);
MultiByteToWideChar(CP_ACP,
0
,
PChar
(s), -
1
,
PWideChar
(ws), len);
Result:=ws;
end
;
function
WideToUTF8(
const
WS:
WideString
): UTF8String;
var
len:
integer
;
us: UTF8String;
begin
Result:=
''
;
if
(Length(WS) =
0
)
then
exit;
len:=WideCharToMultiByte(CP_UTF8,
0
,
PWideChar
(WS), -
1
,
nil
,
0
,
nil
,
nil
);
SetLength(us, len);
WideCharToMultiByte(CP_UTF8,
0
,
PWideChar
(WS), -
1
,
PChar
(us), len,
nil
,
nil
);
Result:=us;
end
;
function
AnsiToUTF8(
const
S:
AnsiString
): UTF8String;
begin
Result:=WideToUTF8(AnsiToWide(S));
end
;
function
UTF8ToWide(
const
US: UTF8String):
WideString
;
var
len:
integer
;
ws:
WideString
;
begin
Result:=
''
;
if
(Length(US) =
0
)
then
exit;
len:=MultiByteToWideChar(CP_UTF8,
0
,
PChar
(US), -
1
,
nil
,
0
);
SetLength(ws, len);
MultiByteToWideChar(CP_UTF8,
0
,
PChar
(US), -
1
,
PWideChar
(ws), len);
Result:=ws;
end
;
function
WideToAnsi(
const
WS:
WideString
):
AnsiString
;
var
len:
integer
;
s:
AnsiString
;
begin
Result:=
''
;
if
(Length(WS) =
0
)
then
exit;
len:=WideCharToMultiByte(CP_ACP,
0
,
PWideChar
(WS), -
1
,
nil
,
0
,
nil
,
nil
);
SetLength(s, len);
WideCharToMultiByte(CP_ACP,
0
,
PWideChar
(WS), -
1
,
PChar
(s), len,
nil
,
nil
);
Result:=s;
end
;
function
UTF8ToAnsi(
const
S: UTF8String):
AnsiString
;
begin
Result:=WideToAnsi(UTF8ToWide(S));
end
;
end
.
//*************************//**************************
//以上是一个文件,保存后引用。
//*************************//**************************
uses superobject, util_utf8;
procedure TForm1.Timer1Timer(Sender: TObject);
var
idHttp: TIdHTTP;
get_back,tmp1,tmp2:string;
jRet: ISuperObject;
strm: TStringStream;
begin
strm := TStringStream.Create('');
try
idHttp := TIdHTTP.Create(nil);
IdHTTP1.Get(self.Edit1.Text, strm);
get_back:=UTF8ToAnsi(strm.DataString);
idHttp.Disconnect;
idHttp.Free;
finally
strm.Free;
end;
jRet:=TSuperObject.Create(stObject);
jRet := SO(copy(get_back,8,Length(get_back)-9));
tmp1:= jRet.O['gszzl'].AsString();
self.Label2.Caption :=jRet.O['name'].AsString()+':'+tmp1;
end;