スライドショー

【Java入門】文字コードの確認・変換・指定する方法を解説!

こんにちは!エンジニアの中沢です。

Javaには文字列を正しく表示するために指定する「文字コード」があります。「文字コード」の指定を間違えると、文字化けの原因になるので注意してください。

この記事では、

  • 文字コードとは
  • デフォルトの文字コードを確認する方法
  • 文字列とbyte型の配列を変換する方法
  • 文字コードを判定する方法
  • 文字コードを指定してファイルを読み込む方法
  • 文字コードを指定してファイルに書き込む方法

などの使い方に関して解説していきます。

今回はこれらの方法を覚えるために、文字コードのさまざまな使い方をわかりやすく解説します!

文字コードとは

初めに文字コードについて解説します。

文字列はプログラムの内部ではbyte型の配列の数値で表現されています。このbyte型の配列を文字列に変換して表示するときの対応関係を文字コードと言います。

よく使われる文字コードにはShift_JIS、UTF-8、UTF-16などがあります。外部のファイルを読込む場合に、ファイルで使われている文字コードを正しく指定しないと文字化けしてしまうことがあるので注意が必要です。

文字化けした場合は次のように元の文字が分からない状態で表示されます。

��0B0D0F0H0J
苣膄蛣膈�

Javaのデフォルトの文字コードはUnicode(UTF-16)です。

デフォルトの文字コードを確認する方法

使用している開発環境のデフォルトのエンコーディングを調べるには、SystemクラスのgetPropertyメソッドを使用します。

public class Main {
    public static void main(String[] args) {

        System.out.println(System.getProperty("file.encoding"));
    }
}

実行結果:

UTF-8

このプログラムを実行した環境では、「UTF-8」がデフォルトの文字コードであることが確認できました。

文字列とbyte型の配列を変換する方法

文字コードを指定してbyte型の配列で取得する方法

次に文字列から、文字コードを指定してbyte型の配列で取得する方法を解説します。文字列をbyte型の配列で取得するには、getBytesメソッドを使います。

getBytesメソッドの使い方を覚えるために、次のプログラムで確認してみましょう。

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
 
        try {
            String str = "あ";
         
            byte[] bytes1 = str.getBytes("UTF-16");
            byte[] bytes2 = str.getBytes("UTF-8");
            byte[] bytes3 = str.getBytes("SJIS");
         
            System.out.println(Arrays.toString(bytes1));
            System.out.println(Arrays.toString(bytes2));
            System.out.println(Arrays.toString(bytes3));
         
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
[実行結果]
[-2, -1, 48, 66]
[-29, -127, -126]
[-126, -96]

文字コードを指定して、文字列からbyte型の配列に変換することができました!ここではgetBytesメソッドに例外処理が必要なため、try-catch文を使用しています。

byte型の配列をString型の文字列に変換する方法

次にbyte型の配列をString型の文字列に変換する方法を解説します。byte型の配列を文字列に変換するには次のような書き方をします。

new String(byte型の配列, 使用する文字コード)

byte型の配列を文字列に変換する方法を覚えるために、次のプログラムで確認してみましょう。

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
 
        try {
            String str = "あ";
         
            byte[] bytes1 = str.getBytes("UTF-16");
            byte[] bytes2 = str.getBytes("UTF-8");
            byte[] bytes3 = str.getBytes("SJIS");
         
            System.out.println(Arrays.toString(bytes1));
            System.out.println(Arrays.toString(bytes2));
            System.out.println(Arrays.toString(bytes3));
         
            String newStr1 = new String(bytes1, "UTF-16");
            String newStr2 = new String(bytes2, "UTF-8");
            String newStr3 = new String(bytes3, "SJIS");
         
            System.out.println(newStr1);
            System.out.println(newStr2);
            System.out.println(newStr3);
         
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
[実行結果]
[-2, -1, 48, 66]
[-29, -127, -126]
[-126, -96]
あ
あ
あ

byte型の配列を文字列に変換することができました!ここでは文字列をbyte型の配列に変換した後に、元の文字列に戻しています。

文字コードを判定する方法

ここでは、文字コードを判定する方法を解説します。

文字コードが正しい場合には、元の文字列と文字列に変換したbyte配列が等しくなるのでequalsメソッドで比較します。

次のプログラムで確認してみましょう。

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
 
        try {
            String str = "abc";
            byte[] bytes = { 97, 98, 99 };
         
            System.out.println(str.equals(new String(bytes, "UTF-16")));
            System.out.println(new String(bytes, "UTF-16"));
         
            System.out.println(str.equals(new String(bytes, "UTF-8")));
            System.out.println(new String(bytes, "UTF-8"));    
         
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
[実行結果]
false
慢�
true
abc

このプログラムでは文字列"abc"とbyte配列[97, 98, 99]を変換した文字列が等しくなる文字コードを調べています。

equalsメソッドの結果が"UTF-16"のときは”false”になるので、文字コードが間違っていることがわかります。
試しに"UTF-16"で文字列に変換すると文字化けをしてしまいます。

"UTF-8"のときは”true”になるので、文字コードが正しいことがわかります。変換した文字列も”abc”なので正しく変換されています!

文字コードを指定してファイルを読み書きする方法

文字コードを指定してファイルを読み込む方法

TXTファイルなどの文字コードを指定して読み込むためには、InputStreamReader及びFileInputStreamクラスを拡張したBufferedReaderクラスを使用します。

引数には文字コードを指定する必要があります。以下に文字コードを指定して、ファイルを読み込む方法を記述します。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class Main {
 
    public static void main(String[] args) {
        /* ファイルの文字コードを指定して読み込む */
        File file = new File("/Users/Shared/java/java.txt");
        try {
            BufferedReader b_reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"Shift-JIS"));
            
            /* 〜ファイル操作〜 */
            
        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

文字コードを指定してファイルに書き込む方法

文字コードを指定してファイルに書き込むためには、BufferedWriter、OutputStreamWriter及びFileOutputStreamクラスを拡張した、PrintWriterクラスを使用します。

引数には文字コードを指定する必要があります。以下に文字コードを指定して、ファイルを書き込む方法を記述します。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

public class Main {
 
    public static void main(String[] args) {
        File file = new File("/Users/Shared/java/java.txt");
        
        try {
            // 文字コードを指定する
            PrintWriter p_writer = new PrintWriter(new BufferedWriter
                (new OutputStreamWriter(new FileOutputStream(file),"Shift-JIS")));
            
            //ファイルに文字列を書き込む
            p_writer.println("apple");
            p_writer.println("orange");
            p_writer.println("melon");
            
            //ファイルをクローズする
            p_writer.close();
        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

ファイルに書き込むためには、PrintWriterクラスのprintlnメソッドを使用し、引数に文字列を指定します。

PrintWriterクラスは、指定したファイルが存在しない場合は新規作成し、すでに同名のファイルが存在する場合は内容が上書きされます。

文字コードを指定してファイルを読み書きする方法については、こちらの記事で詳しく解説しているので、ぜひ確認してください。

【Java】encodingを指定して読み書きする(CSV、テキストファイル)
更新日 : 2019年10月23日

String(文字列クラス)総まとめ

String(文字列クラス)についてさらに詳しく知りたいときはこちらの記事を確認してください!

まとめ

いかがでしたか?

今回は文字コードの変換と判定をする方法について解説しました。

文字コードを間違えると文字化けが発生するので注意してくださいね。もし文字コードのことを忘れてしまったらこの記事を確認してください!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

中沢 丈

中沢 丈

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説