2012-10-11 50 views
3

我有一個TidHttpServer監聽端口8844下面的代碼:可以TidHttpServer(Delphi XE2)處理urlencoded字符嗎?

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    if ARequestInfo.Document <> '/favicon.ico' then 
    begin 
    Memo1.Text := ARequestInfo.Params.Text; 
    end; 
end; 

這是用Delphi XE2編譯。當我瀏覽到

http://localhost:8844/document?Value=%F6 <-- %F6 is the encoded value for ö 

...我得到的結果是:

value=? 

如果我編譯使用德爾福2007年的應用程序,我得到以下結果

value=ö 

這是一個錯誤在Indy中,我錯過了什麼?

回答

5

在XE2中,字符串是Unicode。當TIdHTTPServer解碼D2009及更高版本中的ARequestInfo.Document時,它需要百分比編碼數據解碼爲UTF-8編碼數據,然後解碼爲最終的Unicode字符串。目前沒有改變的選擇(我已經向我們的問題跟蹤器提交了一個功能請求)。 %F6不代表一個有效的UTF-8八位字節,這就是爲什麼你最終與'?'。在UTF-8中,'ö'字符將被編碼爲UTF-8,編號爲$C3 $B6,因此百分比編碼爲%C3%B6,而不是%F6

在D2007中,字符串是Ansi。當TIdHTTPServer對D2007及更早版本中的ARequestInfo.Document進行解碼時,它將原樣提供解碼數據,因此%F6將解碼爲$F6並存儲爲#246。然後,RTL使用本地機器的默認Ansi代碼頁解釋該值,因此它僅代表用於這種定義的Ansi代碼頁的'ö'字符(Windows-1252和ISO-8859-1,但ISO-8859 -5不是,例如)。

我建議你改變你的服務器邏輯在兩個Delphi版本中使用UTF-8編碼的URL。在D2007,您可以使用RTL的UTF8Decode()功能,解碼UTF-8編碼AnsiStringWideString,然後可以分配給其他AnsiString將數據轉換成你最初期待的Ansi值。在D009 +中,會自動爲您處理。

請注意,直接在OnCommandGet事件中訪問UI組件不是線程安全的。你必須與主線程同步才能安全地訪問UI。