Run*_*ner 5 javascript delphi extjs submit indy10
我有一个问题,我不知道如何解决.
我有一个Indy10 HTTP服务器.我在许多应用程序中使用过Indy9和Indy10 HTTP服务器,从未遇到任何问题.但现在我使用带有ExtJS javascript RAI框架的Indy10 HTTP服务器.
问题是当我提交包含非ansi字符的数据时.例如,当我在1250代码页(斯洛文尼亚语,克罗地亚语......)中提交字母"č"时,我在Indy的"未解决的参数" - >"%C4%8D"中得到以下内容.这是utf-8编码中"č"字母的正确十六进制表示.我的所有页面都是utf-8,我从未向Indy提交表单数据时遇到任何问题.我调试了代码,发现我实际上得到了一个像这样的字节序列:[37,67,52,37,56,68].这是字符串"%C4%8D"的字节表示.但是当然Indy无法正确编码为UTF-16.举个例子.实际表格字段:
FirstName=?rt
Run Code Online (Sandbox Code Playgroud)
提交后出现如下:
FirstName=%C4%8Drt
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决这个问题.我查看了ExtJS论坛,但这个主题没有任何内容.有人对这类问题一无所知吗?
编辑:
如果我对params ad JSON进行编码,则它们会正确到达.我也尝试对params进行URL解码,但结果不正确.也许我错过了什么.我会再看看这个.是的,似乎ExtJS URL编码参数
编辑2:
好的,我发现了更多.我比较了帖子数据的实际内容.它是这样的:
Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,未解析的参数都是相同的.我打开了ParseParams,在BDS2006中它们被正确解析,但在2010年它们没有.这是使用delphi进行的Indy10.这个版本有错误还是我做错了什么?
编辑3:
我下载了最新的夜间版本Indy10.仍然是同一个问题.
编辑4:
我不得不接受自己的答案.
就这个话题来回答一下。
这绝对不能像在 unicode 下那样工作。Indy 在内部使用 unicode 字符串。问题在于参数被解码为 TStringList 时。问题是这一行:
Params.Add(TIdURI.URLDecode(s));
Run Code Online (Sandbox Code Playgroud)
在“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;
Run Code Online (Sandbox Code Playgroud)
但我无法相信这样一个常见的任务无法正常工作。有人可以确认这确实是一个错误还是我只是做错了什么?