5

我有一个问题我不知道如何解决。

我有一个 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

提交时是这样的:

FirstName=%C4%8Drt

我不知道如何解决这个问题。我查看了 ExtJS 论坛,但没有关于这个主题的内容。有人知道这种问题吗?

编辑

如果我对参数和 JSON 进行编码,它们会正确到达。我也尝试对参数进行 URL 解码,但结果不正确。也许我错过了什么。我会再看看这个。是的,ExtJS URL 似乎对参数进行了编码

编辑2

好的,我发现了更多。我比较了post数据的实际内容。它是这样的:

Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D

在这两种情况下,未解析的参数都是相同的。我打开了 ParseParams 并且在 BDS2006 中它们被正确解析,但在 2010 年它们不是。这是带有 delphi 的 Indy10。这个版本有错误还是我做错了什么?

编辑3

我下载了最新的夜间版本 od Indy10。还是同样的问题。

编辑4

我被迫接受我自己的答案。

4

3 回答 3

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;

但我不敢相信这样一个常见的任务不能正常工作。有人可以确认这确实是一个错误还是我只是做错了什么?

于 2010-03-04T20:50:04.020 回答
1

字符串似乎是 URL 编码的,因此您使用以下代码进行解码:

uses
  idURI;

value := TIdURI.URLDecode( value );

编辑

似乎存在解码器无法将双字节正确解码为单个字符的情况。查看源代码,如果字符编码为 %UC48D ,它确实会正确解码,但在我的测试中,它仍然无法正确解码。有趣的是 TidURI.ParamsEncode 函数会生成正确的编码,但是使用最新版本的 Indy 10 中的正确例程,这种编码是不可逆的。

于 2010-03-04T17:01:04.160 回答
1

我正在使用 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
  ...

结尾;

于 2011-01-06T14:29:20.037 回答