例如用Utf8Decode处理http://gz.ganji.com/zpshichangyingxiao/ 这个网页的源代码时就是返回空值。
15 个解决方案
#1
看源代码就知道了,delphi的Utf8Decode在解码的时候遇到它认为不正确的字符就返回空串了
还是用winapi靠谱
还是用winapi靠谱
#2
是什么字符?
如果用WINAPI,该怎么用,能否举例下,谢谢
如果用WINAPI,该怎么用,能否举例下,谢谢
#3
不是吧
#4
#5
试试
UTF8Decode(UTF8String(str))
UTF8Decode(UTF8String(str))
#6
用UTF8Decode(UTF8String(str)) 试过了,不能解决问题。
#7
function UTF8Decode(Data: AnsiString): WideString;
begin
SetLength(Result, Length(Data));
SetLength(Data,MultiByteToWideChar(CP_UTF8,0,PAnsiChar(data),Length(Data),PWideChar(Result),Length(Data)));
end;
var
str: AnsiString;
strm: TStringStream;
begin
strm := TStringStream.Create('');
try
IdHTTP1.Get('http://gz.ganji.com/zpshichangyingxiao/', strm);
ShowMessage(UTF8Decode( strm.DataString));
finally
strm.Free;
end;
end;
#8
这么久还没搞定?查个msdn这么费劲么……
function DecodeUtf8Str(const S: UTF8String): WideString;
var lenSrc, lenDst : Integer;
begin
lenSrc := Length(S);
if(lenSrc=0)then Exit;
lenDst := MultiByteToWideChar(CP_UTF8, 0, Pointer(S), lenSrc, nil, 0);
SetLength(Result, lenDst);
MultiByteToWideChar(CP_UTF8, 0, Pointer(S), lenSrc, Pointer(Result), lenDst);
end;
#9
不知道你是不是开发解码163邮箱的程序,163邮箱用了三种编码方式,CODE64,UTF-8及BIG5。有一种解码需要解码两次,如先DECODE64,再DE UTF-8,具体顺序我不记得了,得翻翻我写的代码。
#10
是的,delphi的Utf8Decode在解码的时候遇到它认为不正确的字符就返回空串了
#11
因为在外地,没法测试,回去按7\8楼朋友给的方法试试
#12
问题已解决,谢谢
#13
8楼的代码我试过了,可以正常解码
#14
var
s:AnsiString;
mmo1.Text:=UTF8Encode('中文);
ShowMessage(UTF8Decode(s));
ShowMessage(UTF8Decode(UTF8String(s)));
ShowMessage(DecodeUtf8Str(s));
//测试没发现问题
s:AnsiString;
mmo1.Text:=UTF8Encode('中文);
ShowMessage(UTF8Decode(s));
ShowMessage(UTF8Decode(UTF8String(s)));
ShowMessage(DecodeUtf8Str(s));
//测试没发现问题
#15
可以换种方式,把UTF8Decode 换成 Utf8Encode;
var
ws:string;
begin
ShowMessage(Utf8toAnsi(Utf8Encode(ws)));
end;
var
ws:string;
begin
ShowMessage(Utf8toAnsi(Utf8Encode(ws)));
end;
#1
看源代码就知道了,delphi的Utf8Decode在解码的时候遇到它认为不正确的字符就返回空串了
还是用winapi靠谱
还是用winapi靠谱
#2
是什么字符?
如果用WINAPI,该怎么用,能否举例下,谢谢
如果用WINAPI,该怎么用,能否举例下,谢谢
#3
不是吧
#4
#5
试试
UTF8Decode(UTF8String(str))
UTF8Decode(UTF8String(str))
#6
用UTF8Decode(UTF8String(str)) 试过了,不能解决问题。
#7
function UTF8Decode(Data: AnsiString): WideString;
begin
SetLength(Result, Length(Data));
SetLength(Data,MultiByteToWideChar(CP_UTF8,0,PAnsiChar(data),Length(Data),PWideChar(Result),Length(Data)));
end;
var
str: AnsiString;
strm: TStringStream;
begin
strm := TStringStream.Create('');
try
IdHTTP1.Get('http://gz.ganji.com/zpshichangyingxiao/', strm);
ShowMessage(UTF8Decode( strm.DataString));
finally
strm.Free;
end;
end;
#8
这么久还没搞定?查个msdn这么费劲么……
function DecodeUtf8Str(const S: UTF8String): WideString;
var lenSrc, lenDst : Integer;
begin
lenSrc := Length(S);
if(lenSrc=0)then Exit;
lenDst := MultiByteToWideChar(CP_UTF8, 0, Pointer(S), lenSrc, nil, 0);
SetLength(Result, lenDst);
MultiByteToWideChar(CP_UTF8, 0, Pointer(S), lenSrc, Pointer(Result), lenDst);
end;
#9
不知道你是不是开发解码163邮箱的程序,163邮箱用了三种编码方式,CODE64,UTF-8及BIG5。有一种解码需要解码两次,如先DECODE64,再DE UTF-8,具体顺序我不记得了,得翻翻我写的代码。
#10
是的,delphi的Utf8Decode在解码的时候遇到它认为不正确的字符就返回空串了
#11
因为在外地,没法测试,回去按7\8楼朋友给的方法试试
#12
问题已解决,谢谢
#13
8楼的代码我试过了,可以正常解码
#14
var
s:AnsiString;
mmo1.Text:=UTF8Encode('中文);
ShowMessage(UTF8Decode(s));
ShowMessage(UTF8Decode(UTF8String(s)));
ShowMessage(DecodeUtf8Str(s));
//测试没发现问题
s:AnsiString;
mmo1.Text:=UTF8Encode('中文);
ShowMessage(UTF8Decode(s));
ShowMessage(UTF8Decode(UTF8String(s)));
ShowMessage(DecodeUtf8Str(s));
//测试没发现问题
#15
可以换种方式,把UTF8Decode 换成 Utf8Encode;
var
ws:string;
begin
ShowMessage(Utf8toAnsi(Utf8Encode(ws)));
end;
var
ws:string;
begin
ShowMessage(Utf8toAnsi(Utf8Encode(ws)));
end;