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。
上一篇: Can TidHttpServer (Delphi XE2) handle urlencoded characters?
下一篇: Compiler bug when using generics and forward declaration in Delphi XE2