2014-02-14 1 views
0

Я новичок в HTTP. У меня есть несколько HTTP GET, которые возвращают текст, закодированный в ANSI или UTF-8. Есть ли способ определить, что возвращается, чтобы я мог обрабатывать преобразование в методе, а не делать испытания и жестко кодировать необходимые преобразования для каждого? или если это может обрабатывать сам Инди?Как определить кодировку данных ответа в TIdHTTP?

Вот что я использую GET:

Основной метод

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

Вы должны изучить параметр 'Charset' для заголовка Content-Type. –

+2

У меня был подобный вопрос некоторое время назад, я думаю, что ответ [Remy Lebeau] (http://stackoverflow.com/a/18832982/800214) может помочь. Во всяком случае, не используйте TMemoryStream для строк, используйте TStringStream – whosrdaddy

+0

НЕ используйте 'TStringStream'! В D2009 + для этого требуется указать «TEncoding» в конструкторе, и впоследствии вы не сможете его изменить. Если вы не знаете точную кодировку раньше времени, вы можете легко рассортировать кодировку и вызвать сбой преобразования. –

ответ

1

TIdHTTP имеет перегруженную версию Get(), которая возвращает String (который UnicodeString в D2009 + и AnsiString в более ранних версиях). Он обнаруживает кодировку ответа, даже чтобы проанализировать ее из HTML и XML-данных, когда она отсутствует в заголовках HTTP, и использует ее для декодирования данных ответа в UTF-16 в D2009 + и Ansi в более ранних версиях для вас :

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

Посмотрите на этот ответ, где я изложил точную логику обнаружения набор символов, который TIdHTTP использует:

TIdHTTP character encoding of POST response

на отдельной ноте, ваш другой SendGet() метод не следует принимать TMemoryStream по ссылке, так как вы не возвращаетесь g a новый TMemoryStream объект для вызывающего абонента. Вместо этого следует взять общее значение TStream. Это сделает ваш код более гибким:

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

 Смежные вопросы

  • Нет связанных вопросов^_^