- blogs:
- cles::blog

Winstoneで日本語のHTMLを表示する


Winstoneの簡易ウェブサーバー機能で日本語を表示させようとすると、Content-TypeヘッダがContent-Type:text/html; charset=iso-8859-1となっているために文字化けしてしまいます。いつもこれの解決方法を忘れて、ことあるたびに何度かはまっているのでメモ。
† 文字化けの発生メカニズム
ソースを見ると分かりますが、この簡易ウェブサーバーの実体はwinstone.StaticResourceServletというServletで実装されています。これはwinstone本体に組み込まれていて、指定されたURLがServletやJSPにマッピングできないときにデフォルトでこのServletを呼び出すようになっています。このサーブレットは該当のファイル名からContent-Typeを決定するようになっているのですが、文字コードについては考慮されていません。
文字コードを設定していない場合、winstoneのHttpServletRequestやHttpServletResponseの実装はiso-8859-1であると仮定してしまう*1ので、前述のようなContent-Typeが出力されて、ブラウザ側で文字化けが発生してしまうようです。
† ServletなのでFilterが効く
これを回避するのためにはdoGet()/doPost()の処理内にrequest.setCharacterEncoding('UTF-8');のようなエンコーディングの設定をしてやればよいわけです。そのようにwinstone自体をリコンパイルしてもいいのですが、これもServletであることを考えるとFilterを使ったほうが賢明です。ということで、Tomcatのjsp-examplesのfilters/SetCharacterEncodingFilter.javaを使います。
web.xmlに以下の記述を追加
これで日本語のファイルもきちんと表示できます。普段は自前のServletのためにSetCharacterEncodingFilterを入れておくことが多いので、その副作用で文字化けが直ってしまうために、いつもやり方を忘れるんですよね。
- *1: このあたりはServletのSpecでそうなっているのかな(未確認)
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2173
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112156)
3 . 年次の人間ドックへ(111640)
4 . 2023 年分の確定申告完了!(1つめ)(111231)
5 . 三菱鉛筆がラミーを買収(111125)