by WebSurfer
2011年5月22日 17:52
応答のエンコーディングを UTF-16 にする場合、MSDN ライブラリの globalization 要素 (ASP.NET 設定スキーマ) に、requestEncoding 属性と responseEncoding 属性は同じにする必要があると書いてあるので、以下のように両方 UTF-16 に設定してしまうことがあるかもしれません。
<configuration>
<system.web>
<globalization
requestEncoding="utf-16"
responseEncoding="utf-16"/>
</system.web>
</configuration>
でも、そうすると、サーバー側でポストデータが正しく取得できず、IsPostPack プロパティが true にならなかったり、Button.Click などのイベントが発生しないという問題が起こります。
原因は、以下のマイクロソフトサポートオンラインのページに詳しく書いてありますが、IE が submit するデータのエンコーディングです。
INFO: Internet Explorer Always POSTs Unicode Data as UTF-8
IE は、ページのエンコーディングが UTF-16 の場合、submit するデータは UTF-8 でエンコーディングするそうです。
データのエンコーディングが UTF-8 なのに、requestEncoding="utf-16" と設定されているため、サーバー側が UTF-16 として処置するので、データが正しく取得できないということのようです。
IE 以外のブラウザ(Firefox 3.6.17 と Chrome 11.0.696.68)でも試してみましたが、結果は同じでした。
ちなみに Shift_JIS の場合は、ページのエンコーディングが Shift_JIS ならブラウザが submit するデータのエンコーディングも Shift_JIS になるので、UTF-16 の時のような問題ないそうです(というより、requestEncoding と responseEncoding の両方を Shift_JIS としておかないとダメ)。
解決策は、globalization 要素の requestEncoding="utf-16" を削除(デフォルトで UTF-8 になる)することです。
または、特定のページだげ応答のエンコーディングを UTF-16 にしたいのであれば、そのページのページディレクティブで ResponseEncoding="UTF-16" と設定し、その他はすべてデフォルトのまま(globalization 要素は指定しない)とすればよさそうです。