代码之家  ›  专栏  ›  技术社区  ›  Runner

Delphi indy10 http服务器和ExtJS表单提交

  •  5
  • Runner  · 技术社区  · 15 年前

    我有一个indy10http服务器。我在许多应用程序中都使用过Indy9和indy10http服务器,从来没有遇到过任何问题。但是现在我正在使用indy10http服务器和extjsjavascript RAI框架。

    问题是当我提交包含非ansi字符的数据时。例如,当我提交1250码页(斯洛文尼亚语、克罗地亚语…)的信件“”时,我在Indy的“unparsed params”->“%下得到以下信息C4%8D”。这是utf-8编码中“”字母的正确十六进制表示。我所有的页面都是utf-8,我在向Indy提交表单数据时从来没有遇到过任何问题。我调试了代码,发现实际上得到了如下字节序列:[37,67,52,37,56,68]。这是字符串“%C4%8D”的字节表示形式。当然,Indy不能将其正确编码为UTF-16,举个例子。实际表单字段:

    FirstName=črt
    

    FirstName=%C4%8Drt
    

    编辑 :

    :

    好吧,我发现了更多。我比较了帖子数据的实际内容。它是这样的:

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

    在这两种情况下,未解析的参数是相同的。我已经打开了ParseParams,在2006年 它们被正确解析,但在2010年,它们却没有被正确解析。这是印10与德尔福散装。这个版本有没有bug或者我做错了什么?

    :

    我在10年前下载了最新的夜间版本。还是一样的问题。

    :

    我被迫接受自己的答案。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Runner    15 年前

    回答这个问题。

    在unicode下,这肯定不能正常工作。Indy在内部使用unicode字符串。问题是当参数被解码为TStringList时。问题在于线路:

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

    我找到的解决方法是使用“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;
    

        2
  •  1
  •   skamradt    15 年前

    字符串似乎是URL编码的,因此使用以下代码进行解码:

    uses
      idURI;
    
    value := TIdURI.URLDecode( value );
    

    编辑

        3
  •  1
  •   Marco    14 年前

    我使用Delphi 7并迁移到Indy 10。我发现葡萄牙语字符可能存在问题,并通过更改以下源代码来解决此问题:

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

    结束;