- 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 を使ってログインすることができます。
sp-20100315154616644595554@cles.net
- Servlet filter 文字化け
- Yahoo! - 10/03/13 19:03:22
- windows7 文字化け
- Yahoo! - 10/03/08 10:41:55
- ヤフー クローラー 文字化け
- Yahoo! - 10/03/07 04:51:21
- xml 日本語を表示
- Yahoo! - 10/03/04 14:40:15
- content-type 日本語
- Yahoo! - 10/02/25 18:51:45
- クローラー メール 文字化け
- Yahoo! - 10/02/19 10:34:32
- SourceForge.JPのSubversion... (4)
- コインランドリー (4)
- おめでとうございます (4)
- 時間がたっても変わらないもの (4)
- 知恵の輪 サターン編 (3)
- 和食 小錦 (3)
- XPathのチートシート (3)
- サーバセットアップ (3)
- .inはインドのccTLDなのか (3)
- Thanks ! 10000 Hit ! (3)
2 . やっぱりあった!パクれる読書感想文! [7255x]
3 . Echofon for Firefox [6159x]
4 . 急性胃腸炎 [5565x]
5 . 芸能人の本名。 [5489x]
- CD-ROM起動で、HDDを完全消去
- NP_Moblog v1.16
- pinzoro 01/15
- hsur 12/29
- and more...
- 耳がおかしいと思ったら突発..
- baca 01/13
- hsur 01/13
- and more...
★はてな認証APIをつかってログインすることができます。




