入出力のエンコーディング(UTF-8 など) — 文字化け防止
文字化けの原因は「保存時の文字コード」と「読み込み時の文字コード」が一致していないこと。
Javaでは 明示的にエンコーディングを指定することで、文字化けを防げます。初心者向けに、UTF-8を中心に解説します。
基本の考え方
- 文字コード(エンコーディング): 文字をバイト列に変換するルール。例:UTF-8, Shift_JIS, EUC-JP。
- 一致が大事: 書き込みと読み込みで同じエンコーディングを使う。
- Javaの標準: 内部的には文字列は常に Unicode(UTF-16)。入出力時にエンコーディングを指定する。
書き込み時にエンコーディングを指定
import java.io.*;
import java.nio.charset.StandardCharsets;
public class WriteUTF8 {
public static void main(String[] args) throws IOException {
try (Writer w = new OutputStreamWriter(
new FileOutputStream("data.txt"),
StandardCharsets.UTF_8)) {
w.write("こんにちは UTF-8");
}
}
}
Java- OutputStreamWriter: バイトストリームに文字コードを指定して書き込む。
- StandardCharsets.UTF_8: 定数で安全に指定できる。
読み込み時にエンコーディングを指定
import java.io.*;
import java.nio.charset.StandardCharsets;
public class ReadUTF8 {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("data.txt"),
StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}
Java- InputStreamReader: バイトストリームを文字に変換するときにエンコーディングを指定。
- BufferedReader: 行単位で効率的に読み込める。
例題で練習
例題1: UTF-8で保存して読み込む
try (Writer w = new OutputStreamWriter(
new FileOutputStream("hello.txt"),
StandardCharsets.UTF_8)) {
w.write("こんにちは");
}
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("hello.txt"),
StandardCharsets.UTF_8))) {
System.out.println(br.readLine()); // こんにちは
}
Java👉 書き込みと読み込みで同じ UTF-8 を指定すれば文字化けしない。
例題2: Shift_JISで保存して読み込む
try (Writer w = new OutputStreamWriter(
new FileOutputStream("sjis.txt"),
java.nio.charset.Charset.forName("Shift_JIS"))) {
w.write("日本語 SJIS");
}
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("sjis.txt"),
java.nio.charset.Charset.forName("Shift_JIS")))) {
System.out.println(br.readLine()); // 日本語 SJIS
}
Java👉 日本語環境で古くから使われる Shift_JIS も同じように指定可能。
例題3: Scannerでエンコーディング指定
import java.util.*;
import java.nio.charset.StandardCharsets;
import java.io.*;
try (Scanner sc = new Scanner(new File("data.txt"), StandardCharsets.UTF_8)) {
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
}
Java👉 Scanner でも第二引数でエンコーディングを指定できる。
テンプレート集
書き込み
Writer w = new OutputStreamWriter(new FileOutputStream("file.txt"), StandardCharsets.UTF_8);
Java読み込み
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8));
JavaScanner
Scanner sc = new Scanner(new File("file.txt"), StandardCharsets.UTF_8);
Java実務のコツと落とし穴
- 必ず明示: デフォルトエンコーディングに頼らない。環境依存で文字化けする。
- UTF-8推奨: 国際化対応や他システム連携では UTF-8 が標準。
- ファイル保存時: エディタや外部ツールも同じエンコーディングで保存する。
- Charset定数を使う:
StandardCharsets.UTF_8のように定数を使うとタイプミス防止。
まとめ
- 文字化け防止の鉄則: 書き込みと読み込みで同じエンコーディングを指定。
- UTF-8を基本にする: 国際化・互換性に強い。
- Javaでは OutputStreamWriter / InputStreamReader / Scanner で指定可能。
👉 練習課題として「UTF-8で日本語を保存し、Shift_JISで読み込んで文字化けを確認」すると、エンコーディングの重要性が体感できます。
