2012-10-21 113 views
4

如何強制TIdHttp.post方法返回以utf-8編碼的網頁?我試過http.Request.ContentEncoding := 'UTF-8'但它沒有網絡。這是我的代碼:TIdHttp.Post - 無法獲得utf-8編碼

procedure TeUpdateNews.Check; 
var url: string; 
    Http: TIdHttp; 
    SS: TStringStream; 
    param: TStringList; 
    SWIDESTRING: WideString; 
begin 
    http := TIDHttp.Create(nil); 
    http.HandleRedirects := true; 
    http.ReadTimeout := 5000; 
    http.Request.ContentEncoding := 'UTF-8'; 

    param := TStringList.create; 
    param.Clear; 

    url := CONST_SOME_WWW; 

    try 
    SS := TStringStream.Create; 
    try 
     SWIDESTRING := http.Post(url, param); 

     // it's not getting utf-8! 
     ShowMessage(SWIDESTRING); 
    finally 
     SS.Free; 
     param.free; 
    end; 
    finally 
    Http.Free; 
    end; 
end; 
+3

你可以用一個「接收字符集:UTF-8」試頭(請參閱[HTTP標頭字段列表](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields))。但服務器沒有義務返回UTF-8。但是,Delphi XE2中的Indy應該將HTTP響應轉換爲Delphi UnicodeString,不需要將該變量聲明爲WideString。 – mjn

回答

10

好的,我發現我做錯了什麼。如果有人將搜索:

你需要設置在構造函數中的TStringStream編碼,所以它應該是這樣的:

try 
    // this is it :-) 
    SS := TStringStream.Create('', TEncoding.UTF8); 
    try 
    // using overloaded post method this time 
    // it writes return in the ss stream 
    http.Post(url, param, ss); 

    // now it's getting utf-8, baby! 
    ShowMessage(ss.DataString); 
+0

+1謝謝你。 – XBasic3000

1
var 

    ds: TIdMultipartFormDataStream; 

begin 

    ds := TIdMultipartFormDataStream.Create; 

    try 

    ds.AddFormField('test', UTF8Encode('äöüß'), 'utf-8').ContentTransfer := '8bit'; 

    try 

     ShowMessage(HTTP.Post('http://mysite.net/test.php', ds)); 

    except 

    end; 

    finally 

    FreeAndNil(ds); 

    end; 

end; 
+1

儘管此代碼可能會解決該問題,但如果您添加了如何實現的說明,則會很有幫助。 – Ren