2010-03-04 43 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 
    ... 

端;