[英]Delphi indy10 http server and ExtJS form submit
我有一個我不知道如何解決的問題。
我有一個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
提交時如下所示:
FirstName=%C4%8Drt
我不知道該怎么解決。 我看了ExtJS論壇,但是這個話題什么都沒有。 有人知道這種問題嗎?
編輯 :
如果我將參數廣告和JSON編碼,則它們可以正確到達。 我也嘗試對URL進行參數解碼,但結果不正確。 也許我錯過了一些東西。 我會再看這個。 是的,似乎ExtJS URL可以對參數進行編碼
編輯2 :
好的,我發現了更多。 我比較了帖子數據的實際內容。 就像這樣:
Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D
在這兩種情況下,未解析的參數都是相同的。 我啟用了ParseParams,並在BDS2006中對其進行了正確的解析,但是在2010年時則無法進行解析。 這是Indy10中充斥着delphi的內容。 此版本中是否存在錯誤,或者我做錯了什么?
編輯3 :
我下載了最新的每晚版本od Indy10。 還是一樣的問題。
編輯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;
但是我不能相信這樣的常見任務無法正常工作。 有人可以確認這確實是一個錯誤,還是我做錯了什么?
字符串似乎是經過URL編碼的,因此您可以使用以下代碼進行解碼:
uses
idURI;
value := TIdURI.URLDecode( value );
編輯
似乎存在解碼器無法將雙字節解碼為單個字符的情況。 從源頭來看,如果將字符編碼為%UC48D的話,確實可以正確解碼,但是在我的測試中,它仍然無法正確解碼。 有趣的是TidURI.ParamsEncode函數會生成正確的編碼,但是使用最新版本的Indy 10中的正確例程,這種編碼是不可逆的。
我正在使用Delphi 7並遷移到Indy10。我發現葡萄牙語字符可能存在問題,並通過以下方法解決了這一問題:
procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String);
...
//Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose
Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked
...
結束;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.