- 文字化けで混乱したところ
- 文字化けの原因特定
- 基本
- デフォルトの文字コードを見る方法
- リクエスト値に文字コードを設定する
- 別の文字コードに変換する方法
- 別の文字コードに変換する方法2(まずはこれをやる!)
- jspに文字コード追加
- web.xmlに文字コードフィルターを追加する方法
- sever.xmlで文字コード指定
- Unicodeとは
文字化けで混乱したところ
文字化け済みの文字にgetBytes("UTF-8")とかやってもしょうがないんだよ。
化けた文字を別の文字コードに変換してるだけだから、別の文字コードでまた化けた文字ができるだけ。
文字化けしてるってことはめちゃくちゃなバイト配列になってるから、それにエンコードかけてもまた変なバイト配列ができるってことね。
→これを解決する方法みつかった。「別の文字コードに変換する方法2」のところに書いた。
文字化けの原因特定
下記サイトで文字化け前の文字を入力して調査する。
ここで原因がわかったら下記のコードで文字コードを変換する。
String str = "あああ" // ←ここが文字化けしている想定 String s = new String(str.getBytes("ISO-8859-1"), "変換したい文字コード");
基本
基本的には開発環境の文字コードとファイルの文字コードを合わせればOK。
例えばEclipseでtest.propertiesファイルを見たら文字化けしてた!という時。
test.propertiesファイルをサクラエディタとかで開いて、UTF-8に設定する。そして中身を編集して保存する。
これだけで普通はOK。
デフォルトの文字コードを見る方法
System.out.println("デフォルト文字コード;" + System.getProperty("file.encoding"));
リクエスト値に文字コードを設定する
ただし、GETはダメでPOSTのみ有効らしい。
request.setCharacterEncoding("UTF-8");
別の文字コードに変換する方法
String str = "あ"; byte[] bytes = str.getBytes("UTF-8"); // UTF-8でバイト配列に変換 String str2 = new String(bytes, "UTF-8"); //文字に戻す // 元の文字が文字化けしてなければ、どの文字コードでも変換できるはず?→多分ダメ byte[] bytes = str.getBytes("SJIS"); String str2 = new String(bytes, "SJIS");
別の文字コードに変換する方法2(まずはこれをやる!)
この方法が一番良い気がする。
元の文字が文字化けしていてもOK!
String str = "あ" //←これが文字化けしている想定 // byte配列をそのまま取り出す byte[] iso = str.getBytes("ISO-8859-1"); // あとはお好みの文字列に自由に変換可能 String utf3 = new String(iso, "UTF-8"); String sjis = new String(iso, "SJIS"); String eucjp = new String(iso, "EUC-JP");
jspに文字コード追加
<%@page contentType="text/html; charset=UTF-8" %> <% request.setCharacterEncoding("UTF-8"); %>
web.xmlに文字コードフィルターを追加する方法
追加したらプロジェクトをクリーンする。
<?xml version="1.0" encoding="UTF-8"?> <web-app> <display-name>Struts Blank Application</display-name> <!-- ↓ここからフィルター --> <filter> <!-- ↓フィルターの名前を設定 --> <filter-name>EncodeFilter</filter-name> <!-- ↓上記で放り込んだフィルタークラスのパス --> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <!-- ↓フィルタークラスのフィールドの初期化。この場合はUTF-8でエンコーディングさせる設定 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <!-- ↓使いたいフィルターの名前と一致させる --> <filter-name>EncodeFilter</filter-name> <!-- ↓どのURLを呼んだときに上記フィルタを起動させるか設定。この場合は全てのURLに対してフィルタを使う --> <url-pattern>/*</url-pattern> </filter-mapping> <!-- ここまでフィルター --> <!-- Standard Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
・参考
Linuxに使われる日々 : strutsで日本語が文字化けするのを直す - livedoor Blog(ブログ)
sever.xmlで文字コード指定
Serversプロジェクトのserver.xmlに赤字部分を追記。
追加したらプロジェクトをクリーンする。
・参考
Linuxに使われる日々 : strutsで日本語が文字化けするのを直す - livedoor Blog(ブログ)
Unicodeとは
文字コードの規格の1つ。
Unicode規格で策定されたUTFにはUTF-8、UTF-16、UTF-32の3種類がある。
文字符号化方式:UTF-7、UTF-8、UTF-16、UTF-32
ということらしい。