Java 逆引き集 | 入出力のエンコーディング(UTF-8 など) — 文字化け防止

Java Java
スポンサーリンク

入出力のエンコーディング(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));
Java

Scanner

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で読み込んで文字化けを確認」すると、エンコーディングの重要性が体感できます。

タイトルとURLをコピーしました