こんにちは!エンジニアの中沢です。
Javaには文字列を正しく表示するために指定する「文字コード」があります。「文字コード」の指定を間違えると、文字化けの原因になるので注意してください。
この記事では、
- 文字コードとは
- デフォルトの文字コードを確認する方法
- 文字列とbyte型の配列を変換する方法
- 文字コードを判定する方法
- 文字コードを指定してファイルを読み込む方法
- 文字コードを指定してファイルに書き込む方法
などの使い方に関して解説していきます。
今回はこれらの方法を覚えるために、文字コードのさまざまな使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
文字コードとは
初めに文字コードについて解説します。
文字列はプログラムの内部では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クラスは、指定したファイルが存在しない場合は新規作成し、すでに同名のファイルが存在する場合は内容が上書きされます。
文字コードを指定してファイルを読み書きする方法については、こちらの記事で詳しく解説しているので、ぜひ確認してください。
String(文字列クラス)総まとめ
String(文字列クラス)についてさらに詳しく知りたいときはこちらの記事を確認してください!
まとめ
いかがでしたか?
今回は文字コードの変換と判定をする方法について解説しました。
文字コードを間違えると文字化けが発生するので注意してくださいね。もし文字コードのことを忘れてしまったらこの記事を確認してください!