3

次のコードでポート 8844 をリッスンする TidHttpServer があります。

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 のバグですか?

4

1 に答える 1

5

XE2 では、文字列は Unicode です。TIdHTTPServerが D2009 以降で をデコードする場合ARequestInfo.Document、パーセントでエンコードされたデータを UTF-8 エンコード データにデコードする必要があり、それが最終的な Unicode 文字列にデコードされます。現在、それを変更するオプションはありません (私は、問題トラッカーに機能リクエストを送信しました)。 %F6は有効な UTF-8 オクテットを表していないため、'?'. UTF-8 では、'ö'文字は として UTF-8 でエンコードされるため、 ではなく$C3 $B6としてパーセント エンコードされます。%C3%B6%F6

D2007 では、文字列は Ansi です。D2007以前で をデコードすると、デコードされたデータがそのまま提供されるため、TIdHTTPServerにデコードされ、 として保存されます。その値は、ローカル マシンのデフォルトの Ansi コードページが何であれ、それを使用して RTL によって解釈されるため、そのように定義された Ansi コードページに対してのみ文字を表します (Windows-1252 および ISO-8859-1 はそうですが、ISO-8859-たとえば、5 はそうではありません)。ARequestInfo.Document%F6$F6#246'ö'

サーバー ロジックを変更して、両方の Delphi バージョンで UTF-8 でエンコードされた URL を使用することをお勧めします。D2007 では、RTL の関数を使用して、エンコードされUTF8Decode()た UTF-8 を にデコードし、それを別の関数に割り当てて、データを最初に期待していた Ansi 値に変換できます。D009+ では、それは自動的に処理されます。AnsiStringWideStringAnsiString

余談ですが、イベントで UI コンポーネントに直接アクセスすることは、OnCommandGetスレッドセーフではありません。UI に安全にアクセスするには、メイン スレッドと同期する必要があります。

于 2012-10-11T19:57:49.710 に答える