2012-01-20 17 views
1

TWebRequestのコンテンツフィールドから実際のUnicode文字列を取得する方法を教えてください。私が入力Unicode値を得るためにTWebRequestのコンテンツフィールドを読み込もうとすると、テキストに入力しましたが、実際の値の代わりにスクランブルされた値が表示されます。 私が与えた入力はДоброでしたが、内容フィールドには値Ð "обр¾¾があります。レスポンスcontenttypeはtext/htmlとcharset = 'UTF-8'に設定されています。 テキストボックスに入力された実際の値が表示されないのはなぜですか?私はTWebRequestのコンテンツフィールドからUnicode文字列を読み取る

procedure TWebModule1.WebModule1HelloAction(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
var 
    s : string; 
    PageProducer1 : TPageProducer; 
begin 
    Response.ContentType := 'text/html;charset=UTF-8'; 
    s := Request.ContentFields.Text; 
    PageProducer1 := TPageProducer.Create(nil); 
    try 
    PageProducer1.HTMLFile := 'C:\Hello.tmpl'; 
    PageProducer1.OnHTMLTag := PageProducer1HTMLTag; 
    Response.Content := PageProducer1.Content + ' ' + 'Entered string:' + s; 
    finally 
    PageProducer1.Free; 
    end; 
end; 

Hello.tmplをテストしていた

のサンプルコードは、単なるテキストボックスを持っており、ボタン

答えて

3

あなたはUnicodeStringにあなたのUTF-8文字列を変換するUTF8ToString機能を使用することができますを提出します。

+0

返事をお寄せいただきありがとうございます。UTF8ToStringは完全に機能しますが、文字セットはUTF-8に設定されているため、文字列はut8でエンコードされており、ユニコード文字列に変換する必要があります。 Requestオブジェクトに設定できる方法や設定はありますか?それは自動的に変換を行います。 – ravi12

+2

HTTPペイロードは任意の八重奏のシーケンスです。 content-type(およびcontent-encoding)フィールドは、その解釈方法を示します。適切なヘッダーフィールドを読み、正しい方法でペイロードを処理するのはアプリケーションの責任です。 –

+0

これは正しく動作しますが、警告を出します* W1058 'string'から 'RawByteString'への潜在的なデータ損失を伴う暗黙的な文字列キャスト*。コンテンツの代わりにRawContentを使用すると、警告が消えます。 –

0

TWebRequest.ContentRawを使用すると、要求ヘッダーに定義されている文字セットに基づいて正しいコードページを持つAnsiStringが返されます。残念ながら、手動でコンテンツを処理する必要があります。

文字列(UnicodeString)を取得するには、文字セットがUTF-8であることが確かであればTEncoding.UTF8.GetString(BytesOf(Request.RawContent))を使用します。またあなたが、ヘッダの元のcontentTypeを確認することができます。

var ct: string; 
... 
ct := string(Request.GetFieldByName('Content-type')).ToUpper; 
if (Pos('CHARSET', ct) > 0) and (Pos('UTF-8', ct) > 0) then 
    Result := TEncoding.UTF8.GetString(BytesOf(Request.RawContent)) 
    else 
    Result := TEncoding.ANSI.GetString(BytesOf(Request.RawContent)); 

TWebRequest.ContentTWebRequest.ContentFieldsの私の現在のバージョン()に盗聴されています。それらは常にANSIでエンコードされます。 TWebRequest.EncodingFromContentTypeTWebRequest.ContentTypeから文字セットを抽出しようとしましたが、contentTypeのcharset部分は、この時点で以前のコードによってすでに削除されています。

関連する問題