0

複数の言語をサポートするページがあります(ユーザーはいつでも言語を変更できます)。
Initialize Cultureメソッドでのユーザー選択に基づいて、スレッドのカルチャを更新します。

また、選択した国のコードページに基づいて応答オブジェクトを更新し、その文字セットを使用するエンコーディングのWebNameに設定します(コードページに基づいて応答オブジェクトを更新しないと、コントロールにバインドされたデータが文字化けします)。リソースファイルもコードページに基づいてローカライズされます。

上記の変更を行った後、ページはブラウザに正しく表示されます。

ただし、ユーザーがアジアの言語の1つでデータを入力すると、テキストがすべて台無しになります。ドロップダウンリストは、実際には無効なコールバックまたはポストバック引数の例外をスローします。

request.contentEncodingを確認したところ、まだUTF-8(web.configで設定)であることがわかりました。

BeginRequestイベント中にrequest.ContentEncodingを変更すると、入力が正しく入力されます。しかし、ページサイクルの早い段階で、ユーザーが言語を選択したかどうかはわかりません。

上記のアプローチはそれを実行する正しい方法ですか?着信リクエストのエンコーディングを動的に設定するにはどうすればよいですか?

4

1 に答える 1

2

リクエストは、クライアントから送信されたものです。彼が送るものを選ぶことはできません、それはあなたのインプットです。ただし、クライアントはおそらく、フォームを含むページで定義されたエンコーディングでこの入力を送信する必要があります。

ページに文字セットを正しく設定していますか?送信しないでよろしいですか?

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

HTMLヘッダーで、データが別のエンコーディングである間?

コメントの後に追加:私が正しく理解していれば、UTF-8とは異なるエンコーディングで出力ページを生成しています(本当にそうする必要がありますか?)。その後、POSTされたフォームデータのデコードで問題が発生します。最も簡単な方法は、データがUTF-8にポストバックされるようにすることです。そのために、HTMLはのaccept-charset属性を定義しますform。ただし、この属性はIEではサポートされていません。IEの場合、ハック<input>があります。「奇妙な」Unicode文字を含む偽物を追加して、IEの投稿をUTF-8として強制することができます。

これはあまり良くありませんが、より簡単な解決策は、常にUTF-8を使用することです。出力ページに異なるエンコーディングを使用する必要が本当にありますか?

または、別のエンコーディングでデータを出力する必要がある場合、設定のソリューションRequest.ContentEncodingはAFAIAAが使用できる唯一の方法です。使用するエンコーディングを決定するには、POSTバックされる非表示フィールドを追加することをお勧めします(理論的には、HTTPヘッダーを使用できますが、ブラウザーがPOSTデータとともに送信することはないと思います)。次のようなものを使用します。

    public void Application_BeginRequest(object sender, EventArgs args)
    {
        var inputEncoding = Request.Form["hiddenEncoding"];
        if (!String.IsNullOrEmpty(inputEncoding)) Request.ContentEncoding = Encoding.GetEncoding(inputEncoding);
    }
于 2011-02-12T23:21:03.010 に答える