- 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に以下の記述を追加
<!-- 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が必要です→http://blog.cles.jp/item/2173
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
- 「鋲螺」の読み方 (3)
- NP_DragAndDropUploader v1.2 (2)
- 覚醒の配達で目覚める朝 (2)
- シェルスクリプトで最新のフ... (1)
- 予期しない例外でRubyが落ち... (1)
2 . ネットワーク接続時のパスワード保存先 (16815)
3 . JavaScriptでCSVを読み込む (14112)
4 . 「鋲螺」の読み方 (13198)
5 . NHK がネットを使ったラジオ配信を開始してた (13066)