by WebSurfer
2010年5月19日 22:24
先の投稿 日本語の文字化けの問題(1) で書きました [WebResource.axdを圧縮] にチェックを入れると日本語が文字化けする問題に対応しました。
原因は、BlogEngine.Core の Web\HttpModules フォルダの中にある HTTP モジュール CompressionModule.cs で、Encoding.Default でバイト列を文字列に変換し、文字列を処理した後、
再び Encoding.Default で文字列をバイト列に戻しているところでした。
MSDN ライブラリによると、Encoding.Default は "オペレーティング システムの現在の ANSI コード ページのエンコーディングを取得します" とのことで、
サーバーの OS のデフォルトの Encoding になるようです。自分が使っているホスティングサービス会社のサーバーは日本にあるので、Encoding.Default は Shift_JIS になるようです。
一方、実際の Encoding は UTF-8 であるため、Encoding.Default での変換で情報が失われて文字化けしてしまうようです。
web.config の globalization 要素の requestEncoding, responseEncoding を Shift_JIS にすると文字化けがなくなるという話を Web で見ますが、そういう理由のようです。
正しい解決方法は、CompressionModule.cs で使われている Encoding.Default を実際に使用されている Encoding にすることだと思われます。
WebResourceFilter クラスの Write メソッドの中に 2 ヶ所問題の部分がありますが、それを以下のように変更してみました。
public override void Write(byte[] buffer, int offset, int count)
{
//string html = System.Text.Encoding.Default.GetString(buffer);
string html = HttpContext.Current.Response.ContentEncoding.GetString(buffer);
・・・中略・・・
//byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
byte[] outdata = HttpContext.Current.Response.ContentEncoding.GetBytes(html);
_sink.Write(outdata, 0, outdata.GetLength(0));
}
とりあえず、上の写真のように [WebResource.axdを圧縮] にチェックを入れても文字化けはしなくなりました。このまましばらく様子を見たいと思います。