簡體   English   中英

Delphi indy10 http服務器和ExtJS表單提交

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM