はじめに
Javaの学習を始めて、最初のプログラムを実行したところ
日本語が文字化けして表示された、という経験はありませんか?
System.out.println("Java楽しも");
エラーは出ていないのに、表示結果だけがおかしい。
Java × Windows環境では非常によくある現象で私自身この現象に悩みました。
この記事の対象者
- Javaを学び始めたばかりの方
-
printlnは動くのに 日本語だけ文字化けする人 - 「エラーじゃないのに結果がおかしい」状態で困っている人
- Windows + VS Code で Java を実行している人
この記事では、なぜ文字化けが起きるのか → どう直すのかを、説明します。
結論:プログラムは正しい(文字コードの問題)
先に結論です。
- コードは 間違っていない
- Javaの実行も 成功している
- 問題は 文字コードの不一致
つまりこれは「バグ」や「エラー」ではなく、文字の扱い方のズレが原因です。
何が原因なのか(文字コードのズレ)
今回の環境を整理すると、次のようになります。
| 役割 | 文字コード |
|---|---|
| Javaソース / VS Code | UTF-8 |
| Java実行時の内部 | UTF-8 |
| Windows コマンドプロンプト | Shift_JIS |
そもそも「文字コード」とは?
コンピュータの中では、
「あ」「A」「漢字」などの文字は すべて数字として扱われています。
その変換ルールが 文字コード です。
UTF-8とは?
- 世界中の文字を扱える
- Web、VS Code、Java で標準的に使われている
- 日本語も問題なく表現できる
➡ JavaやVS Codeは基本UTF-8で動いているというようなこと。
Shift_JISとは?
- 昔からWindowsで利用されている
- コマンドプロンプトの既定である
- UTF-8とはルールが違う
なぜ文字化けするのか
今回起きているのは、
- Java:UTF-8で「Java楽しも」を出力
- コマンドプロンプト:Shift_JISとして解釈
➡ 出す側と表示する側が違う言語で話している状態
その為、Java讌ス縺励b という結果になってしまっている。
解決方法①:実行時に文字コードを指定する(最短・確実)
まず一番シンプルで安全な方法になります。
java -Dfile.encoding=UTF-8 First
実行結果
Java楽しも
この方法のメリット
- 一発で直る
- ソースコード不要
- 初心者でも理解しやすい
➡ まずはこの方法。
解決方法②:VS Codeで毎回UTF-8にする(慣れてきた人向け)
毎回オプションを書くのが面倒な場合は、
VS Codeの設定で 常にUTF-8でJavaを実行できます。
settings.jsonという場所に記述する必要があるのですが、
検索窓でこの単語を検索した際、2つありました。
まずはこの2つのsettings.jsonの違いを明確にしてからどちらに記述すればいいのかを説明します。
settings.json が2つ出てくる理由
VS Codeで設定を開くと、次の2つが表示されました。
C:\Users\ユーザー名\AppData\Roaming\Code\User\settings.json
C:\Java\1\.vscode\settings.json
それぞれ役割が違います。
グローバル設定(全体)
AppData\Roaming\Code\User\settings.json
- VS Code全体に適用
- どのプロジェクトでも有効
- 基本はこちらを編集
ワークスペース設定(フォルダ専用)
.vscode\settings.json
- このフォルダだけ有効
- プロジェクト別に設定を変えたいとき用
- 空でも問題なし
今回はどちらに書くべきか
結論:グローバル設定に書くのがおすすめ
理由としては
- Javaをどこで実行しても文字化けさせないため
- 初心者は「毎回同じ挙動」の方が混乱しないため
追加する設定(これだけ)
"terminal.integrated.env.windows": {
"JAVA_TOOL_OPTIONS": "-Dfile.encoding=UTF-8"
},
※ settings.json の 最後の } の直前に追加します。
設定後にやること
- settings.json を保存
- VS Codeを完全に閉じる
- 再度起動
- 実行
java First
Java楽しも
となれば成功です!
解決方法③:chcp で変更する方法(補足)
chcp 65001
java First
chcp って何?
-
chcp= Change Code Page - 「表示ルールを切り替える」命令
65001 って何?
つまりこのコマンドは、
chcp 65001
➡ 「コマンドプロンプトをUTF-8モードに切り替える」
という意味になります。
注意点
- フォント次第で逆に崩れることがある
- 毎回実行が必要
- 元に戻すと再発する
➡理解として知っておく程度でOK
➡ 実用は①か②がおすすめです。
まとめ
- 文字化け=エラーではない
- 原因は UTF-8 と Shift_JIS の違い
- 最短解決
java -Dfile.encoding=UTF-8 First
-
chcpは「表示ルール切り替えコマンド」
おわりに
私のようなJava初学者の人にとって
今回のような問題は最初に一度は必ずハマるポイントかと思います。
ここを理解できると、
-
javac時の文字化け - 日本語コメント問題
- PowerShell / Git Bash の違い
も自然に理解できるようになります。
参考記事