Utf8Decode不能正确解码UTF8字符串的问题

时间:2022-09-02 22:45:36
使用Utf8Decode处理UTF-8字符串时,有时候正常,有时候返回空值,请问是怎么回事?
例如用Utf8Decode处理http://gz.ganji.com/zpshichangyingxiao/ 这个网页的源代码时就是返回空值。

15 个解决方案

#1


看源代码就知道了,delphi的Utf8Decode在解码的时候遇到它认为不正确的字符就返回空串了
还是用winapi靠谱

#2


是什么字符?
如果用WINAPI,该怎么用,能否举例下,谢谢

#3


不是吧

#4


该回复于2009-03-13 09:06:46被版主删除

#5


试试
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));
//测试没发现问题

#15


可以换种方式,把UTF8Decode 换成 Utf8Encode;


var
  ws:string;
begin
  ShowMessage(Utf8toAnsi(Utf8Encode(ws)));
end;

#1


看源代码就知道了,delphi的Utf8Decode在解码的时候遇到它认为不正确的字符就返回空串了
还是用winapi靠谱

#2


是什么字符?
如果用WINAPI,该怎么用,能否举例下,谢谢

#3


不是吧

#4


该回复于2009-03-13 09:06:46被版主删除

#5


试试
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));
//测试没发现问题

#15


可以换种方式,把UTF8Decode 换成 Utf8Encode;


var
  ws:string;
begin
  ShowMessage(Utf8toAnsi(Utf8Encode(ws)));
end;