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