我有个问题我不知道怎么解决。
我有一个Indy10 HTTP服务器。我在许多应用程序中都使用过Indy9和Indy10 HTTP服务器,而且从未遇到任何问题。但是现在我使用的是带有Indy10 javascript框架的ExtJS HTTP服务器。
问题是当我提交包含非ansi字符的数据时。例如,当我提交"č“(1250年代码页中的一封信)时(斯洛文尼亚语,克罗地亚语.)我得到以下印地下的“未解析参数”-> "%C4%8D“。这是正确的十六进制表示"č“字母的utf-8编码。我所有的网页都是utf-8,我从来没有遇到任何问题,把表格数据填入印第。我调试了代码,并看到我实际上得到了如下字节序列: 37、67、52、37、56、68。这是字符串"%C4%8D“的字节表示形式。当然,印第不能正确地将其编码到UTF-16。举个例子。实际表单字段:
FirstName=črt当被征服的时候是这样出来的:
FirstName=%C4%8Drt我不知道怎么解决这个问题。我看过ExtJS论坛,但是没有关于这个话题的东西。有人知道这种问题吗?
编辑
如果我对JSON中的params进行编码,它们就会正确到达。我还试图通过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
我被迫接受我自己的答案。
发布于 2010-03-04 20:50:04
来回答这个话题。
这是绝对不工作的,因为它应该在unicode。Indy在内部使用unicode字符串。问题是当参数被解码为TStringList时。问题是这条线:
Params.Add(TIdURI.URLDecode(s));在"TIdHTTPRequestInfo.DecodeAndSetParams“中找到的。它不能正确地解码params,可能是因为它正在处理unicode字符串。
我找到的解决办法是使用来自"HTTPDecode“的"HTTPApp.pas”。
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;但是,我不能相信这样一项共同的任务没有正确地工作。有人能确认这是个错误吗,还是我做错了什么?
发布于 2010-03-04 17:01:04
字符串似乎是URL编码的,因此您可以使用以下代码进行解码:
uses
idURI;
value := TIdURI.URLDecode( value );编辑
似乎存在这样一种情况,即解码器不能正确地将双字节解码为单个字符。从源代码上看,如果字符编码为%UC48D,它似乎会正确地解码,但在我的测试中,这仍然不能正确解码。有趣的是,TidURI.ParamsEncode函数生成正确的编码,但使用最新版本的Indy 10中的正确例程,这种编码是不可逆的。
发布于 2011-01-06 14:29:20
我正在使用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
...结束;
https://stackoverflow.com/questions/2381017
复制相似问题