我有一个我不知道如何解决的问题。
我有一个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可以对参数进行编码
EDIT2 :
好的,我发现了更多。我比较了帖子数据的实际内容。就像这样:
Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D
在这两种情况下,未解析的参数都是相同的。我在BDS2006中打开了ParseParams
它们已正确解析,但在2010年则无法解析。这是Indy10中充斥着delphi的内容。此版本中是否存在错误,或者我做错了什么?
EDIT3 :
我下载了最新的每晚版本od Indy10。仍然是同样的问题。
EDIT4 :
我被迫接受自己的回答。
最佳答案
要回答这个话题。
这绝对是行不通的,因为它应该在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;
但是我不能相信这样的常见任务无法正常工作。有人可以确认这确实是一个错误,还是我做错了什么?
关于javascript - Delphi indy10 http服务器和ExtJS表单提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2381017/