Java:文字化けの対処方法は?
2005年4月24日 開発文字化けは結構悩まされる事が多く、原因もJSP、サーブレット、APサーバ等色々と考えられます。
下記は現時点で調べたメモ書きになりますので、間違っていたりする場合もあるかもしれません。
間違いが分かった時点や不足点はその都度更新したいと思います。
文字コードの設定の優先順位は下記になります。
1.HTTPにおけるContent-Typeヘッダのcharsetパラメータ
2.HTMLのMETA宣言及びhttp-equiv属性で設定された、Content-Typeヘッダのcharsetパラメータ
3.HTMLの各要素のcharset属性
→APサーバの設定もあったような・・・? 分かり次第追加します。
対処例1
下記でJSP内の日本語は文字化けせずに表示されると思います。
JSPにエンコーディングを記述します(JSPファイルをシフトJISで作成した場合)。
<%@ page contentType="text/html; charset=Shift_JIS" %>
→ブラウザにデータを返却する際の文字コード指定します。
<%@ page pageEncoding="Shift_JIS" %>
→JSPをサーブレットに変換する際の文字コード指定します。
※上記の詳細は自分自身まだ良く分かっていないので、分かり次第追加します(笑)。
※JSPファイルをどの文字コードで作成したかによって、該当の文字コードを指定します。
例えばEUCでJSPファイルを作成した場合は、Shift_JISをeuc-jpに変更する必要があります。
下記でStruts(1.1)のリクエストやFormに送信された日本語がサーブレット内で文字化けせずに扱えると思います。
方法1
リクエストからの送信データをどの文字コードで扱うか指定します。
request.setCharacterEncoding("Shift_JIS");
HTMLフォームで入力された日本語文字列はサーブレットエンジンによってISO-8859-1でエンコードされています。
元のバイト列に逆変換してから、文字コードを指定して、Unicodeに変換するようにします。
String input1 = new String(practice1Form.getInput1().getBytes("iso-8859-1"), "Shift_JIS"));
方法2
resetメソッドはFormに値がセットされる前に呼ばれるメソッドです。
ここでエンコード指定を行います。
public void reset(ActionMapping mapping, HttpServletRequest request) {
input1 = "";
input2 = "";
try {
request.setCharacterEncoding("Shift_JIS");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
既にエンコードされているので、特別な処理は必要ないです。
String input1 = practice1Form.getInput1();
Strutsではない場合で特に上記のようなメソッドが用意されていない場合は、1の方を使用するって感じですかね?
※Strutsの場合、フィルタ機能を使用すれば同じようにFormに値がセットされる前に、文字コードの指定ができるようですので、別途調査した後に追加します。
上記でサーブレットから送信された日本語もJSPで文字化けせずに表示されると思います。
参考URL
http://liffey2.ld.infoseek.co.jp/java/japanese/
http://members.at.infoseek.co.jp/ss_yama/java/servlet_japanese.html
http://www2d.biglobe.ne.jp/~msyk/
http://www.ingrid.org/java/jserv/i18n/corruptedchar.html
http://www.atmarkit.co.jp/fjava/rensai3/mojibake01/mojibake01.html
参考書籍
Apache Struts 逆引き大全 345の極意 P67, 71, P404
下記は現時点で調べたメモ書きになりますので、間違っていたりする場合もあるかもしれません。
間違いが分かった時点や不足点はその都度更新したいと思います。
文字コードの設定の優先順位は下記になります。
1.HTTPにおけるContent-Typeヘッダのcharsetパラメータ
2.HTMLのMETA宣言及びhttp-equiv属性で設定された、Content-Typeヘッダのcharsetパラメータ
3.HTMLの各要素のcharset属性
→APサーバの設定もあったような・・・? 分かり次第追加します。
対処例1
下記でJSP内の日本語は文字化けせずに表示されると思います。
JSPにエンコーディングを記述します(JSPファイルをシフトJISで作成した場合)。
<%@ page contentType="text/html; charset=Shift_JIS" %>
→ブラウザにデータを返却する際の文字コード指定します。
<%@ page pageEncoding="Shift_JIS" %>
→JSPをサーブレットに変換する際の文字コード指定します。
※上記の詳細は自分自身まだ良く分かっていないので、分かり次第追加します(笑)。
※JSPファイルをどの文字コードで作成したかによって、該当の文字コードを指定します。
例えばEUCでJSPファイルを作成した場合は、Shift_JISをeuc-jpに変更する必要があります。
下記でStruts(1.1)のリクエストやFormに送信された日本語がサーブレット内で文字化けせずに扱えると思います。
方法1
リクエストからの送信データをどの文字コードで扱うか指定します。
request.setCharacterEncoding("Shift_JIS");
HTMLフォームで入力された日本語文字列はサーブレットエンジンによってISO-8859-1でエンコードされています。
元のバイト列に逆変換してから、文字コードを指定して、Unicodeに変換するようにします。
String input1 = new String(practice1Form.getInput1().getBytes("iso-8859-1"), "Shift_JIS"));
方法2
resetメソッドはFormに値がセットされる前に呼ばれるメソッドです。
ここでエンコード指定を行います。
public void reset(ActionMapping mapping, HttpServletRequest request) {
input1 = "";
input2 = "";
try {
request.setCharacterEncoding("Shift_JIS");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
既にエンコードされているので、特別な処理は必要ないです。
String input1 = practice1Form.getInput1();
Strutsではない場合で特に上記のようなメソッドが用意されていない場合は、1の方を使用するって感じですかね?
※Strutsの場合、フィルタ機能を使用すれば同じようにFormに値がセットされる前に、文字コードの指定ができるようですので、別途調査した後に追加します。
上記でサーブレットから送信された日本語もJSPで文字化けせずに表示されると思います。
参考URL
http://liffey2.ld.infoseek.co.jp/java/japanese/
http://members.at.infoseek.co.jp/ss_yama/java/servlet_japanese.html
http://www2d.biglobe.ne.jp/~msyk/
http://www.ingrid.org/java/jserv/i18n/corruptedchar.html
http://www.atmarkit.co.jp/fjava/rensai3/mojibake01/mojibake01.html
参考書籍
Apache Struts 逆引き大全 345の極意 P67, 71, P404
コメント