BLOGTIMES
2007/09/02

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

  winstone  charset 
このエントリーをはてなブックマークに追加

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に以下の記述を追加

<!-- filters --> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <!-- filter-mappings --> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

これで日本語のファイルもきちんと表示できます。普段は自前のServletのためにSetCharacterEncodingFilterを入れておくことが多いので、その副作用で文字化けが直ってしまうために、いつもやり方を忘れるんですよね

  • *1: このあたりはServletのSpecでそうなっているのかな(未確認)

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2173
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン