はじめに
Javaで標準入力を使って日本語を処理しようとしたとき、文字化けが発生することがあります。この問題に悩まされた経験がある方も多いのではないでしょうか?この記事では、文字化けの原因と解決策を、シンプルな「連絡先検索アプリ」を例に解説します。
文字化けの問題とは
問題のコード
次のコードをコマンドプロンプトで実行すると、入力した日本語が正しく表示されません。
import java.util.Scanner;
public class ContactManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("名前を入力してください:");
String name = scanner.nextLine();
System.out.println("こんにちは、" + name + "さん!");
}
}
実行例
名前を入力してください:
山田
こんにちは、????さん!
文字化けの原因
エンコーディングの不一致
-
コマンドプロンプト(cmd.exe):
- デフォルトのエンコーディングは
Shift-JIS
。
- デフォルトのエンコーディングは
-
Javaプログラム:
- デフォルトのエンコーディングは環境依存(多くの場合
UTF-8
)。
- デフォルトのエンコーディングは環境依存(多くの場合
エンコーディングが一致しないため、日本語入力が正しく解釈されず、文字化けが発生します。
解決方法
文字化けを解消するには、エンコーディングを明示的に指定して、Javaプログラムとコマンドプロンプトのエンコーディングを一致させる必要があります。
修正版コード
import java.util.Scanner;
public class ContactManager {
public static void main(String[] args) {
// Shift-JISエンコーディングを指定
try (Scanner scanner = new Scanner(System.in, "Shift-JIS")) {
System.out.println("名前を入力してください:");
String name = scanner.nextLine().trim();
System.out.println("こんにちは、" + name + "さん!");
} catch (Exception e) {
System.out.println("エラーが発生しました: " + e.getMessage());
}
}
}
ポイント
-
Scanner
にエンコーディングを指定:-
new Scanner(System.in, "Shift-JIS")
を使用して、標準入力をShift-JIS
エンコーディングで処理します。
-
-
trim
で余分な空白を削除:- 入力時に発生する不要な空白を削除して、正確にデータを処理します。
実行手順
1. コードを保存
ファイル名を ContactManager.java
として保存します。
2. コードをコンパイル
javac ContactManager.java
3. コマンドプロンプトのコードページを設定
コマンドプロンプトが Shift-JIS
を使用するように設定します。
chcp 932
4. プログラムを実行
java ContactManager
動作確認
入力例
名前を入力してください:
山田
出力例
こんにちは、山田さん!
文字化けを防ぐ仕組みの解説
なぜこれで解決するのか?
-
Scanner
のエンコーディングを指定-
Shift-JIS
は、コマンドプロンプトのデフォルトエンコーディングです。これに合わせることで、Javaプログラムが入力された日本語を正しく解釈します。
-
-
エンコーディングの統一
-
Scanner
でShift-JIS
を指定することで、プログラム全体のエンコーディングを統一します。
-
応用例: UTF-8を使用する場合
もし UTF-8
を使用する環境(例: Windows Terminal, PowerShell)で動作させたい場合は、以下のようにコードを修正します。
UTF-8対応コード
import java.util.Scanner;
public class ContactManager {
public static void main(String[] args) {
// UTF-8エンコーディングを指定
try (Scanner scanner = new Scanner(System.in, "UTF-8")) {
System.out.println("名前を入力してください:");
String name = scanner.nextLine().trim();
System.out.println("こんにちは、" + name + "さん!");
} catch (Exception e) {
System.out.println("エラーが発生しました: " + e.getMessage());
}
}
}
実行手順
- コードページをUTF-8に変更:
chcp 65001
- プログラムを実行。
まとめ
-
文字化けの原因:
- Javaプログラムと実行環境(コマンドプロンプトなど)のエンコーディングが一致していない。
-
解決方法:
-
Scanner
にエンコーディングを明示的に指定する。
-
-
応用:
-
Shift-JIS
とUTF-8
を切り替えて、さまざまな環境で動作するように対応可能。
-