2012-10-11 49 views
3

我有一个TidHttpServer监听端口8844下面的代码:可以TidHttpServer(Delphi XE2)处理urlencoded字符吗?

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=? 

如果我编译使用德尔福2007年的应用程序,我得到以下结果

value=ö 

这是一个错误在Indy中,我错过了什么?

回答

5

在XE2中,字符串是Unicode。当TIdHTTPServer解码D2009及更高版本中的ARequestInfo.Document时,它需要百分比编码数据解码为UTF-8编码数据,然后解码为最终的Unicode字符串。目前没有改变的选择(我已经向我们的问题跟踪器提交了一个功能请求)。 %F6不代表一个有效的UTF-8八位字节,这就是为什么你最终与'?'。在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编码AnsiStringWideString,然后可以分配给其他AnsiString将数据转换成你最初期待的Ansi值。在D009 +中,会自动为您处理。

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