5

解決方法がわからない問題があります。

Indy10HTTPサーバーがあります。私は多くのアプリケーションでIndy9とIndy10の両方のHTTPサーバーを使用してきましたが、問題はありませんでした。しかし今、私はExtJSjavascriptRAIフレームワークでIndy10HTTPサーバーを使用しています。

問題は、ansi以外の文字を含むデータを送信する場合です。たとえば、1250コードページ(スロベニア語、クロアチア語...)の文字である文字「č」を送信すると、Indyの「unparsedparams」->「%C4%8D」で次のようになります。これは、utf-8エンコーディングでの「č」文字の正しい16進表現です。私のページはすべてutf-8であり、フォームデータをIndyに送信するのに問題はありませんでした。コードをデバッグしたところ、[37、67、52、37、56、68]のようなバイトシーケンスが実際に取得されていることがわかりました。これは、文字列 "%C4%8D"のバイト表現です。しかしもちろん、IndyはこれをUTF-16に正しくエンコードすることはできません。例として。実際のフォームフィールド:

FirstName=črt

送信すると次のようになります。

FirstName=%C4%8Drt

これを解決する方法がわかりません。ExtJSフォーラムを見ましたが、このトピックについては何もありません。誰かがこの種の問題について何か知っていますか?

編集

paramsとJSONをエンコードすると、正しく到着します。また、パラメータをURLデコードしようとしましたが、結果が正しくありません。多分私は何かを逃した。これをもう一度見ていきます。そして、はい、ExtJSURLはパラメータをエンコードしているようです

EDIT2

わかりました、私はもっと発見しました。投稿データの実際の内容を比較しました。これは次のようなものです。

Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D

どちらの場合も、解析されていないパラメータは同じです。ParseParamsをオンにしていて、BDS2006では正しく解析されていますが、2010では正しく解析されていません。これは、デルファイでバルクされたIndy10です。このバージョンにバグがありますか、それとも何か間違ったことをしていますか?

EDIT3

最新のナイトリービルドodIndy10をダウンロードしました。それでも同じ問題。

EDIT4

私は自分の答えを受け入れることを余儀なくされています。

4

3 に答える 3

4

このトピックに答えるために。

これは、Unicodeでは正常に機能していません。Indyは内部でUnicode文字列を使用します。問題は、パラメータがTStringListにデコードされるときです。問題は次の行です。

Params.Add(TIdURI.URLDecode(s));

「TIdHTTPRequestInfo.DecodeAndSetParams」にあります。おそらくUnicode文字列で機能しているため、paramsを正しくデコードしません。

私が見つけた回避策は、「HTTPApp.pas」の「HTTPDecode」を使用することです。

Params := TStringList.Create;
try
  Params.StrictDelimiter := True;
  Params.Delimiter := '&';

  // parse the parameters and store them into temporary string list
  Params.DelimitedText := UTF8ToString(HTTPDecode(UTF8String(Request.UnparsedParams)));
  // do something with params... 
finally
  Params.Free;
end;

しかし、そのような一般的なタスクが正しく機能していないとは信じられません。誰かがこれが本当にバグであることを確認できますか、それとも私は何か間違ったことをしているだけですか?

于 2010-03-04T20:50:04.020 に答える
1

文字列はURLエンコードされているように見えるため、次のコードを使用してデコードします。

uses
  idURI;

value := TIdURI.URLDecode( value );

編集

デコーダーが2バイトを1文字として正しくデコードしない場合があるようです。ソースを見ると、文字が%UC48Dのようにコーディングされている場合は正しくデコードされるように見えますが、私のテストでは、これはまだ正しくデコードされません。興味深いのは、TidURI.ParamsEncode関数が適切なエンコーディングを生成することですが、このエンコーディングは、最新バージョンのIndy10の適切なルーチンを使用して元に戻すことはできません。

于 2010-03-04T17:01:04.160 に答える
1

私はDelphi7を使用しており、Indy 10に移行しています。ポルトガル語の文字に問題がある可能性があり、以下のソースを変更してこれを解決します。

procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String);
  ...
  //Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose
  Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked
  ...

終わり;

于 2011-01-06T14:29:20.037 に答える