スポンサー広告 - スポンサーサイト

--/--/-- (--) --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【プログラミング】JAVA - setCharacterEncoding

2013/02/17 (日) 21:48

久々にJavaのネタです。

先日仕事で遭遇したことをメモ。
仕事でStruts2をベースをしたフレームワークを使用しています。
そこでこんなことが起こりました。

画面からの入出力、ソース共にShift_JIS(Windows-31J)でという要件でした。
というわけでstruts.xmlに以下の設定を追加。
<constant name="struts.i18n.encoding" value="Windows-31J"/>
これでStruts2の内部ではリクエスト情報に対して
request.setCharacterEncoding("Windows-31J")
を実行してくれます。

んで、さらにちょっと特殊な要件が発生しました。
リクエスト毎に、とある名前のパラメータが存在したら値を取り出してログに出力してほしい。
これを実現するために、サーブレットフィルタを作成しました。
そのフィルタはStruts2のコントローラーが動く前に仕込み、処理としては
request.getParameter("とある名前");
をして、取り出せるかを試していました。

このフィルタを仕込んでみたところ、なんと入力データが文字化けするようになってしまいました。
調査すること数時間。原因が判明しました。
なんと「request.setCharacterEncoding()」は、事前に「request.getParameter()」を実行されていると、無効になるんだそうです。
つーかJavadocに書いてありました(汗)
---
Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). Otherwise, it has no effect.

【Google翻訳】
この要求の本体で使用される文字エンコーディングの名前をオーバーライドします。このメソッドは、リクエストパラメータの読み取り、またはgetReader()を使用して入力を読み取る前に呼び出す必要があります。それ以外の場合は、効果がありません。
---
なんという事でしょう。文字コードをセットする前にパラメータを読みだしてしまうと、文字コードがセットできないんだそうです。
最初に読みだしたときに、文字コードが何も指定されていないのでデフォルトの「UTF-8」と決めてしまうのでしょう。
まぁ言われてみれば、分からないでもないですよねぇ。
対策としては、自前で「request.setCharacterEncoding()」を実行してしまうか、Struts2のコントローラーが動いた後でパラメータを読みだすかですね。
後者の場合はインターセプタを使用するという手も考えられます。
そもそものサーブレットの仕様であり、Struts2固有の現象ではないので注意です。

意外と盲点というか、知っていればあっという間に解決ですが、知らないと答えを知るまでにそれなりに時間がかかりそうな出来事でした。
二度目が起こらないように書き記しておきます。
関連記事

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。