2010-03-04 42 views
5

我有一個問題,我不知道如何解決。Delphi indy10 http服務器和ExtJS表單提交

我有一個Indy10 HTTP服務器。我在許多應用程序中都使用了Indy9和Indy10 HTTP服務器,並且從來沒有遇到任何問題。但現在我正在使用Indy10 HTTP服務器和ExtJS JavaScript RAI框架。

問題是當我提交包含非ansi字符的數據時。例如,當我在1250代碼頁(斯洛維尼亞語,克羅地亞...)中提交信件「č」時,我在Indy的「未解析的參數」 - >「%C4%8D」中獲得以下內容。這是utf-8編碼中「č」字母的正確十六進制表示形式。我所有的網頁都是utf-8,從來沒有任何問題向Indy提交表單數據。我調試了代碼,發現我實際上得到了如下這樣的字節序列:[37,67,52,37,56,68]。這是字符串「%C4%8D」的字節表示形式。但是,當然,Indy不能正確地將其編碼爲UTF-16。舉個例子。實際的表單字段:

FirstName=črt 

submited時候出來是這樣的:

FirstName=%C4%8Drt 

我不知道如何解決這個問題。我看了ExtJS論壇,但是這個話題沒有任何內容。有人知道這種問題嗎?

編輯

如果我編碼PARAMS廣告JSON他們正確地到達。我也嘗試URL解碼參數,但結果不正確。也許我錯過了什麼。我會再看一遍。是的,似乎ExtJS的URL編碼PARAMS

EDIT2

好吧,我發現更多。我比較了發佈數據的實​​際內容。它是這樣的:

Delphi 2006 (Indy10): FirstName=%C4%8D 
Delphi 2010 (Indy10): FirstName=%C4%8D 

在這兩種情況下,未分析的參數是相同的。我有ParseParams打開並在BDS2006 他們正確解析,但在2010年他們不是。這是Indy10與德爾福組合。這個版本有錯誤嗎?或者我做錯了什麼?

EDIT3

我下載了最新的每日構建OD Indy10。仍然是同樣的問題。

EDIT4

我不得不接受我自己的答案。

回答

4

要回答此主題。

這絕對不是因爲它應該在unicode下工作。 Indy在內部使用unicode字符串。問題是什麼時候參數被解碼爲TStringList。問題是這樣的:

Params.Add(TIdURI.URLDecode(s)); 

在「TIdHTTPRequestInfo.DecodeAndSetParams」中找到。它不能正確解碼參數,可能是因爲它正在處理unicode字符串。

我發現的解決方法是使用「HTTPApp.pas」中的「HTTPDecode」。

Params := TStringList.Create; 
try 
    Params.StrictDelimiter := True; 
    Params.Delimiter := '&'; 

    // parse the parameters and store them into temporary string list 
    Params.DelimitedText := UTF8ToString(HTTPDecode(UTF8String(Request.UnparsedParams))); 
    // do something with params... 
finally 
    Params.Free; 
end; 

但我不敢相信這樣一個普通的任務不能正常工作。有人可以證實這是一個真正的錯誤,或者我只是做錯了什麼?用Delphi 7並遷移到印10.我發現可能的問題與葡萄牙字符和解決這個改變下面的源

+2

即使在VCL的Ansi版本中,TIdHTTPServer的解碼功能也存在尚未解決的已知問題。 – 2010-03-05 01:39:14

+0

感謝您的信息。我擔心我做錯了什麼:) – Runner 2010-03-05 07:01:21

1

它出現的字符串URL編碼,所以你使用下面的代碼來解碼:

uses 
    idURI; 

value := TIdURI.URLDecode(value); 

編輯

這似乎在哪裏解碼器不能正確解碼雙的情況下,字節作爲單個字符。從源頭上看,如果字符被編碼爲%UC48D,它確實會正確解碼,但在我的測試中,這仍然不能正確解碼。有趣的是TidURI。ParamsEncode函數生成正確的編碼,但是這種編碼在最新版本的Indy 10中使用適當的例程不可逆。

+0

是的字符串是URL編碼。我會馬上嘗試。我嘗試將參數發送爲JSON,並且它們正確到達,所以您可能是正確的。 – Runner 2010-03-04 17:02:08

+0

從文檔這應該工作。但事實並非如此。嗯,我錯過了什麼? – Runner 2010-03-04 17:26:34

+0

Indy在雙字節字符解碼中出現一個錯誤。這個問題也與Synapse一起出現。 – skamradt 2010-03-04 19:21:11

1

I'm:

procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String); 
    ... 
    //Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose 
    Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked 
    ... 

端;