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

Tom*_*Tom 3 delphi indy delphi-xe2

我有一个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;
Run Code Online (Sandbox Code Playgroud)

这是使用Delphi XE2编译的.当我浏览

http://localhost:8844/document?Value=%F6   <-- %F6 is the encoded value for ö
Run Code Online (Sandbox Code Playgroud)

......我得到了结果:

value=?
Run Code Online (Sandbox Code Playgroud)

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

value=ö
Run Code Online (Sandbox Code Playgroud)

这是Indy中的一个我错过了什么的错误吗?

Rem*_*eau 5

在XE2中,字符串是Unicode.当TIdHTTPServer解码ARequestInfo.Document在D2009和以后,它需要百分比编码数据解码成UTF-8编码的数据,然后将其解码为最终Unicode字符串.目前没有更改的选项(我已向我们的问题跟踪器提交了功能请求). %F6不代表有效的UTF-8八位字节,这就是你最终的原因'?'.在UTF-8中,'ö'字符将被UTF-8编码为$C3 $B6,因此百分比编码为%C3%B6,而不是%F6.

在D2007中,字符串是Ansi.当TIdHTTPServer解码ARequestInfo.Document在D2007和更早,它提供解码数据原样,从而%F6将解码成$F6和被存储为#246.然后,RTL使用本地计算机的默认Ansi代码页来解释该值,因此它'ö'仅代表定义它的Ansi代码页的字符(Windows-1252和ISO-8859-1,但ISO-8859-例如,5没有.

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

另外,在OnCommandGet事件中直接访问UI组件不是线程安全的.您必须与主线程同步才能安全地访问UI.