如何确定TIdHTTP中的响应数据编码?

时间:2014-02-14 12:41:26

标签: delphi http character-encoding delphi-xe5

我是HTTP新手。我有几个HTTP GET返回以ANSI或UTF-8编码的文本。有没有办法确定返回哪个,以便我可以处理方法中的转换,而不是进行试验并对每个转换进行必要的转换?或者它是否可以由Indy自己处理?

这是我用来获取的东西:

主要方法

procedure TIdHTTPHelper.SendGet
          ( const AURL     : String;
            var   AResponse: TMemoryStream );
begin

  Request.ContentType   := '';
  Request.ContentLength := -1;
  Get ( AURL, AResponse );
  AResponse.Position := 0;

end;

字符串重载方法

procedure TIdHTTPHelper.SendGet
          ( const AURL     : String;
            var   AResponse: String);
var
  Response : TMemoryStream;
begin

  Response      := TMemoryStream.Create;
  SendGet       ( AURL,          Response );
  SetLength     ( AResponse,     Response.Size div 2 );
  Response.Read ( AResponse [1], Response.Size );
  Response.Free;

end;

1 个答案:

答案 0 :(得分:1)

TIdHTTP的重载版Get()会返回String(在D2009中为UnicodeString +在早期版本中为AnsiString。它检测响应字符集,甚至在HTTP标头中不存在时从HTML和XML数据中解析它,并使用它将响应数据解码为D2009 +中的UTF-16和早期版本中的Ansi :

procedure TIdHTTPHelper.SendGet
          ( const AURL     : String;
            var   AResponse: String);
begin
  AResponse :=  Get ( AURL );
end;

看看这个答案,我概述了TIdHTTP使用的确切字符集检测逻辑:

TIdHTTP character encoding of POST response

另外,另一个SendGet()方法不应该通过引用获取TMemoryStream,因为您没有向调用者返回新的TMemoryStream对象。它应该取一般TStream值。这将使您的代码更加灵活:

procedure TIdHTTPHelper.SendGet
          ( const AURL     : String;
            AResponse: TStream );
begin
  Get ( AURL, AResponse );
  AResponse.Position := 0;
end;