文字コードの話はすぐに混乱するからまとめておく必要がある。以下の話は下書きなので信用してはいけません。
バイト列からStringを作る
バイト列からStringを作るときは、そのバイト列を読み込むためのエンコーディングを指定する。
java.lang.String(byte[] bytes, String charsetName)
ん、エンコーディングじゃなくて文字セットになってるなあ。
文字セットについてはjava.nio.charset.Charsetに説明があるが分かりにくい。
「サポートされているエンコーディング」ではエンコーディングという言葉が使われているなあ。区別しているのだろうなあ。ここの一覧には「Windows-31J」や「Shift_JIS」がないが、これらも使えるようだ。よく分からん。
参考
Servletでブラウザから送られてきたパラメータを取得する
例えば、javax.servlet.ServletRequest.getParameter()で取得するのだろう。これを呼び出す前に同クラスのsetCharacterEncoding()でエンコーディングを指定しておくのかな。これを指定していない場合はデフォルトで「ISO-8859-1」が使われるようだ。
(→→ デフォルトがISO-8859-1なのはHTTPの仕様のようだ(JavaWorld 2003.7号より)。これかな。)
でもStrutsを使う場合はプログラマが直接ServletRequestを触ることはなくて、Strutsが勝手にActionFormビーンにパラメータをセットしてしまう。Strutsに任せると「ISO-8859-1」を使ってしまうのだろうからActionFormビーン内で文字コードを変換する必要があると思われる。ActionFormのreset()内でRequestのsetCharacterEncoding()を呼ぶのか、なるほど。或いは、Struts1.1ならorg.apache.struts.action.RequestProcessor.processPreprocess()をオーバーライドすればよいようだ。こちらの方が一箇所で済むから楽だね。
あとはServletフィルタを使う手もあるのか。これが王道?お、TomcatにはSetCharacterEncodingFilterというのが付いているらしい。
参考
- ServletとJSPにおける文字化けについて
- 文字化け“???”の法則とその防止策
- GarbledCharacters
- JavaWorld 2003年6月号
- Jakartaプロジェクト徹底攻略
その他参考
- 文字化けするんですけど… (Servlet Garden)
[ただのメモ]