2014-02-14 25 views
0

我是HTTP新手。我有幾個HTTP GET返回以ANSI或UTF-8編碼的文本。是否有方法可以確定哪些返回,以便我可以在方法中處理轉換,而不是進行試驗併爲每個轉換進行必要的轉換硬編碼?或者如果它可以由Indy自己處理?如何確定TIdHTTP中的響應數據編碼?

下面是我用得到:

主要方法

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

你應該檢查Content-Type頭的一個'Charset'參數。 –

+2

前段時間我有類似的問題,我認爲[Remy Lebeau的回答](http://stackoverflow.com/a/18832982/800214)可以提供幫助。無論如何,不​​要使用TMemoryStream來處理字符串,請使用TStringStream – whosrdaddy

+0

不要使用'TStringStream'!在D2009 +中,它需要你在構造函數中指定一個'TEncoding',並且之後你不能改變它。除非您事先知道確切的字符集,否則很容易使編碼不匹配並導致轉換失敗。 –

回答

1

TIdHTTPGet()重載版本,它返回一個String (這是D2009 +中的UnicodeString和早期版本中的AnsiString)。它檢測到響應字符集,甚至可以在HTTP頭中不存在HTML和XML數據時解析它,並使用它在D2009 +和Ansi中爲您在早期版本中解碼爲UTF-16的響應數據:

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

看一看這個答案在我列出的確切字符集檢測邏輯TIdHTTP用途:

TIdHTTP character encoding of POST response

在一個單獨的說明,你的其他SendGet()方法不應該採取TMemoryStream通過參考,因爲你不是returnin g給調用者一個新的TMemoryStream對象。它應該取值爲一般的TStream。這會讓你的代碼更靈活:

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