TidHttpServer(Delphi XE2)可以处理urlencoded字符吗?

我有一个TidHttpServer使用以下代码监听端口8844:

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  if ARequestInfo.Document <> '/favicon.ico' then
  begin
    Memo1.Text := ARequestInfo.Params.Text;
  end;
end;

这是用Delphi XE2编译的。 当我浏览到

http://localhost:8844/document?Value=%F6   <-- %F6 is the encoded value for ö

...我得到结果:

value=?

如果我使用Delphi 2007编译应用程序,我会得到以下结果

value=ö

这是Indy中一个我错过的东西的bug吗?


在XE2中,字符串是Unicode。 当TIdHTTPServer在D2009及更高版本中解码ARequestInfo.Document时,它需要百分比编码数据解码为UTF-8编码数据,然后将其解码为最终的Unicode字符串。 目前没有改变的选择(我已经向我们的问题追踪器提交了功能请求)。 %F6并不代表一个有效的UTF-8八位字节,这就是为什么你最终得到'?' 。 在UTF-8中, 'ö'字符将被编码为$C3 $B6 ,因此%编码为%C3%B6 ,而不是%F6

在D2007中,字符串是Ansi。 当TIdHTTPServer在D2007及更早版本中解码ARequestInfo.Document ,它将原样提供解码数据,因此%F6将解码为$F6并存储为#246 。 然后,RTL使用本地机器的默认Ansi代码页来解释该值,因此它仅代表Ansi代码页中的'ö'字符,它以这种方式定义它(Windows-1252和ISO-8859-1,但ISO例如,-8859-5不是)。

我建议你改变你的服务器逻辑以在两个Delphi版本中使用UTF-8编码的URL。 在D2007中,可以使用RTL的UTF8Decode()函数将UTF-8编码的AnsiString解码为WideString ,然后可以将其分配给另一个AnsiString以将数据转换为您最初期望的Ansi值。 在D009 +中,会自动为您处理。

在附注中,直接在OnCommandGet事件中访问UI组件不是线程安全的。 你必须与主线程同步才能安全地访问UI。

链接地址: http://www.djcxy.com/p/59885.html

上一篇: Can TidHttpServer (Delphi XE2) handle urlencoded characters?

下一篇: Compiler bug when using generics and forward declaration in Delphi XE2