okinawa

IT勉強メモ

Javaの文字化け対策

文字化けで混乱したところ

文字化け済みの文字にgetBytes("UTF-8")とかやってもしょうがないんだよ。

化けた文字を別の文字コードに変換してるだけだから、別の文字コードでまた化けた文字ができるだけ。

文字化けしてるってことはめちゃくちゃなバイト配列になってるから、それにエンコードかけてもまた変なバイト配列ができるってことね。

→これを解決する方法みつかった。「別の文字コードに変換する方法2」のところに書いた。

文字化けの原因特定

下記サイトで文字化け前の文字を入力して調査する。

ltside.com

ここで原因がわかったら下記のコードで文字コードを変換する。

String str = "あああ" // ←ここが文字化けしている想定
String s = new String(str.getBytes("ISO-8859-1"), "変換したい文字コード");

基本

基本的には開発環境の文字コードとファイルの文字コードを合わせればOK。

例えばEclipseでtest.propertiesファイルを見たら文字化けしてた!という時。

まずはEclipseUTF-8にする。

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");

qiita.com

www.sejuku.net

別の文字コードに変換する方法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");

・参考
ISO-8859-1とは : JavaA2Z

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に赤字部分を追記。
追加したらプロジェクトをクリーンする。

URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

・参考

Linuxに使われる日々 : strutsで日本語が文字化けするのを直す - livedoor Blog(ブログ)

Unicodeとは

文字コードの規格の1つ。

Unicode規格で策定されたUTFにはUTF-8UTF-16UTF-32の3種類がある。

符号化文字集合Unicode

文字符号化方式UTF-7UTF-8UTF-16UTF-32

ということらしい。

https://wa3.i-3-i.info/word11422.html