デindy10httpサーバExtJS書の提出
-
24-09-2019 - |
質問
い問題がわからないのですけど。
いIndy10HTTPサーバーです。また、両Indy9とIndy10HTTPサーバは多くのアプリケーションの開発とにあります。今は私が使っていIndy10HTTPサーバExtJS javascriptライム。
問題は、私が提出データを含む非ansi文字です。例えば私が提出書"ťである"文字1250codepage(スロヴェニア,クロアチアの...)を取得し、以下のインディ"による"ぎに,解析対象外実params"->"%C4%8D".これが正しい進数表現の"ť"書をutf-8でエンコーディングです。全てのページはutf-8といった問題submitingフォームのデータをインディ.私はデバッグのコードを見たいから、一緒に試してみましょうのバイトシーケンスをこのように:[37, 67, 52, 37, 56, 68].このbyte表現を文字列"%C4%8D".もちろんインディな曲なので正UTF-16です。ています。実際のフォームフィールド:
FirstName=črt
出るような場合、このsubmited:
FirstName=%C4%8Drt
わからないどのように解決するのか。ご本人の了解のもと、掲載していExtJSフォーラムがあります。誰もが知識がないこのような問題なのか。
編集:
またエンコードparams ad JSON着いたのを修正またURLデコード、paramsが、結果は正しくありません。そ逃したもの。について見ていくことです。とあるようでExtJS URL符号化し、params
EDIT2:
Okいたします。したものと比較すると、実際のコンテンツのデータです。では以下のようになっています:
Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D
両方の場合にぎに,解析対象外実paramsは同じです。していまParseParamsをオフにBDS2006 も正しく解析され、2010年れます。これはIndy10bulkedとご利用いただけます:standardとexpress。あるバグをこのバージョンにしてるわけではありませんのですか。
EDIT3:
ダウンロードした最新のnightly build od Indy10.み重ねの上に成り立っています。
EDIT4:
私を受け入れざるをえなくな自分なりの答えです。
解決
は、このトピックに答えるために。
それはユニコードの下で必要としてこれは間違いなく動作していません。インディ用途は、内部の文字列をUNICODE。パラメータはTStringListのにデコードされたときに問題があります。問題はラインです。
Params.Add(TIdURI.URLDecode(s));
"TIdHTTPRequestInfo.DecodeAndSetParams" で見つかりました。それはユニコード文字列の上で作業しているためか、正しくないデコードの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;
しかし、私は、このような一般的なタスクが正しく動作していないことを信じることができません。缶誰か確認これは本当にバグであるか、私はちょうど何か間違っているのでしょうか?
他のヒント
はあなたが、デコードに次のコードを使用して、文字列はURLエンコードされて表示されます
uses
idURI;
value := TIdURI.URLDecode( value );
編集
デコーダが適切に単一の文字として二重のバイトをデコードしない場合があります表示されます。ソースを見ると、文字が%UC48Dのようにコーディングされているが、私はこれをテストするには、まだ正しくデコードしない。場合は、それが適切にデコードするだろうと思われるん興味深いのは、TidURI.ParamsEncode機能が適切なエンコーディングを生成していることですが、このエンコーディングは、インディ10
の最新バージョンで、適切なルーチンを使用して可逆的ではありませんインディ10. Iにデルファイ7および移行を使用して - 私は、ポルトガル語の文字でありそうな問題を発見し、これは下のソースを変更解くます:
procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String);
...
//Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose
Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked
...
の端