2014-02-14 2 views
0

저는 HTTP를 처음 사용합니다. ANSI 또는 UTF-8로 인코딩 된 텍스트를 반환하는 여러 HTTP GET이 있습니다. 거기에 반환되는 결정할 수있는 방법을 그래서 나는 시도하고 각각에 대해 필요한 변환을 하드 코딩 메서드에서 변환을 처리 할 수 ​​있습니까? 또는 그것이 Indy 자체로 처리 될 수 있다면?TIdHTTP에서 응답 데이터 인코딩을 결정하는 방법은 무엇입니까?

홈페이지 방법을 문자열

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

'Content-Type' 헤더의'Charset' 매개 변수를 검사해야합니다. –

+2

나는 얼마 전 비슷한 질문을 한 것으로 생각합니다. [Remy Lebeau의 대답] (http://stackoverflow.com/a/18832982/800214) 도움이 될 것 같습니다. 어쨌든 TMemoryStream을 Strings로 사용하지 말고 TStringStream을 사용하십시오 – whosrdaddy

+0

'TStringStream'을 사용하지 마십시오! D2009 +에서는 생성자에서'TEncoding'을 지정해야합니다. 나중에 변경할 수 없습니다. 미리 정확한 캐릭터 세트를 알지 못하면 인코딩을 쉽게 일치시키지 않고 변환 실패를 일으킬 수 있습니다. –

답변

1

TIdHTTP위한 방법을 오버로드

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

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

end; 

String을 반환 Get()의 오버로드 된 버전이 : 여기

내가 들어갈 때 사용하는 것입니다 (이것은 D2009에서는 UnicodeString, 이전 버전에서는 AnsiString). 응답 문자셋을 감지하여 HTTP 헤더에 HTML 및 XML 데이터가없는 경우이를 파싱하고이를 사용하여 D2009 + 및 이전 버전의 UTF-16에 대한 응답 데이터를 디코딩합니다 :

별도의 노트에 TIdHTTP character encoding of POST response

이, 다른 SendGet() 방법은 TMemoryStream을 복용해서는 안 :

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

내가 TIdHTTP가 사용하는 정확한 문자 집합 검색 논리를 설명이 답변에서보세요 참고로, 당신은 돌아 오지 않으므로 새 TMemoryStream 개체를 호출자에게 보냅니다. 대신 값으로 TStream을 사용해야합니다. 그러면 코드가 훨씬 유연 해집니다 :

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