はじめに
- ローカル環境(Windows上のVS CodeやPowerShell)でSpring Bootアプリケーションを起動した際に文字化けが発生したため、その原因調査の経過と解決方法をまとめます。
- 間違い等あれば、指摘いただけると助かります。
- 文字化けの仕組みについては、以下の記事でまとめています。
動作環境
- Windows11
- Visual Studio Code
- Oracle Java 21
- PowerShell 5.1
1. 経緯
Spring BootアプリをJAR化し、VS Code上のターミナルからjava -jar xxxx.jarを実行したところ、コンソール上に表示されたログに文字化けが見られました。
今回の文字化けは、UTF-8の文字列をShift-JIS系として解釈した場合に見られる文字化けに似た表示でした。
文字化けは、文字コード設定が一致しない場合に、日本語文字列が正しく解釈されずに起こります。
そのため、各段階で使用されている文字コードを確認し、どこで食い違いが発生しているかを切り分けます。
まずは、Spring Bootのソースコードの状況を確認します。
-
VS Code上の文字列は、文字化けしているか?
→ ソースコードの文字列に文字化けは見当たりませんでした。 -
ファイルの文字コードは、UTF-8か?
→ VS Code上にも文字コードは「UTF-8」と表示されています。
Spring Bootのソースコードは「UTF-8」であり、文字化けも発生していません。
次は、ログの文字列情報の流れ(Spring Boot → JVM → PowerShell → Windows Console Host)における文字コード設定を確認していきます。
2. JVMの文字コードの確認
まずは、JVM(Java実行環境)の詳細を確認します。
以下のコマンドを実行しました。
java -XshowSettings:properties -version
上記コマンドは、JVMのプロパティ設定を確認するコマンドです。
結果は以下の通りです。
「file.encoding」はJavaのデフォルト設定であるUTF-8となっています。
file.encodingは、JVMが使用するデフォルトの文字コードです。文字コードを明示しないファイル入出力などで利用されます。
また、同じコマンドで、「stdout.encoding」という情報が表示されます。
「stdout.encoding」は、ms932となっています。
stdout.encodingは、JVMが標準出力へ文字列を書き込む際に使用するエンコーディングです。
MS932は、マイクロソフトが提供するShift-JISを独自拡張した文字コードです。
Java 18で導入された JEP 400 (UTF-8 by Default) により、Javaのデフォルト文字セット(file.encoding)はUTF-8になりました。一方で、標準出力(System.out / System.err)が使用するエンコーディング(stdout.encoding)は、コンソール環境に応じて決定されます。そのため、Windows環境では stdout.encoding がMS932になる場合があります。
この時点で file.encoding と stdout.encoding が異なることが確認できました。
3. application.propertiesの確認
次に、application.propertiesの設定内容を確認します。
JVMが標準出力に使用するエンコーディングはMS932となっていました。
しかし、プロパティファイルで文字コードを明示している場合は、そちらが優先される可能性があります。
application.propertiesを確認すると、以下のコードが記載されていました。
logging.charset.console=UTF-8
logging.charset.file=UTF-8
Spring Bootではlogging.charset.consoleによってコンソールログの文字コードをUTF-8に設定していますが、JVMの標準出力設定(stdout.encoding)はMS932であり、文字コード設定が異なっています。
4. Windows Console Hostの確認
次は、「Windows Console Host」の設定を確認します。
Windows Console Hostは、コマンドプロンプトやPowerShellなどのコンソールアプリケーションの表示を担当するWindowsの仕組みです。
以下のコマンドでWindows Console Hostのコードページが確認できます。
chcp
コードページ932は、Windowsで使用されるMS932(Shift-JIS系)を表します。
ここでも、Java側の文字コード設定とWindows Console Hostのコードページに違いが見られます。
この食い違いが文字化けの原因である可能性を考え、Windows Console HostのコードページをUTF-8へ変更して、JARファイルを実行してみます。
Windows Console Hostの文字コードを「UTF-8」に変換する場合は、以下のコマンドを実行してください。
chcp 65001
しかし、Windows Console Hostの文字コードを「UTF-8」に変換しても、ログ文字列の文字化けは解消しませんでした。
5. PowerShellの確認
次に、PowerShellの文字コードを確認します。
PowerShellはWindows Console Host上で動作しており、標準出力は最終的にWindows Console Hostへ表示されます。
PowerShellのOutputEncoding(標準出力に使用する文字コード)を確認するには、以下のコマンドを実行します。
[Console]::OutputEncoding
結果を見ると、「EncodingName」がShift-JISになっていることがわかります。
PowerShellとWindows Console Hostの両方がShift-JIS系の設定となっていたことが、文字化けに影響した可能性があります。
そこで、Windows Console HostのコードページとPowerShellのOutputEncodingをUTF-8へ変更して、JARファイルを実行してみました。
UTF-8へ変更するには、以下のコマンドを実行して下さい。
chcp 65001
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
結果、ログの文字化けは解消しました。
6. 文字化けの原因まとめ
今回のケースでは、Java側とPowerShell・Windows Console Hostの文字コード設定に違いがありました。
ざっくり説明すると、ログの文字列情報は、以下のような流れで画面に出力されます。
Spring Boot
logging.charset.console=UTF-8
↓
JVM
file.encoding : UTF-8
stdout.encoding : MS932
↓
PowerShell
OutputEncoding : Shift-JIS
↓
Windows Console Host
Code Page : 932 (MS932)
↓
画面
Spring Bootでは、コンソールログの文字コードとしてUTF-8が設定されていました。
JVMでもfile.encodingはUTF-8でした。
一方で、PowerShellのOutputEncodingとWindows Console HostのコードページはShift-JIS系の設定でした。
最終的に、Windows Console HostのコードページとPowerShellのOutputEncodingをUTF-8へ変更したところ、文字化けは解消しました。
7. 対策
このような状況で文字化けを解消するには、Spring Bootアプリを実行する前に以下のコマンドを実行してください。
chcp 65001
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
ターミナル起動時のコマンド実行を自動化したい場合は、VS Codeの settings.json に以下を追記することで、VS Codeのターミナル起動時のみ、UTF-8設定を自動実行させることが可能です。
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 >$null; [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()"]
}
}
まとめ
今回の文字化けは、Spring Boot・JVM・PowerShell・Windows Console Hostで使用される文字コード設定が一致していなかったことが影響した可能性が高いと考えられます。
このように、文字化けが発生した場合は、アプリケーションだけでなく、JVM・PowerShell・コンソールまで含めて設定を確認することで、原因を切り分けやすくなります。
また、今回は、アプリをAWS等のクラウド環境へのデプロイすることを念頭に開発を進めていました。
Amazon Linuxを利用するEC2やLinuxベースのコンテナ環境、CloudWatch Logsなどでは、UTF-8を前提として扱われることが一般的です。
そのため、本記事では文字コードをUTF-8へ統一しました。
しかし、運用環境によっては、Java側をMS932に合わせる設定を採用することも可能です。
記事は以上です。
最後までお読みいただき、ありがとうございました。
参考情報一覧
この記事は以下の情報を参考にして執筆しました。
- Spring Boot 3プログラミング入門
- Javaプログラムをコマンドプロンプトで実行したら日本語が文字化けして困った! (最終更新 2025-04-10) (参照 2026-07-23)
- Java コンソール出力が文字化けする場合にやるべきこと (最終更新 2025-03-07) (参照 2026-07-23)
- Windows コンソール ホストはなくならないで欲しい (最終更新 2026-07-20) (参照 2026-07-23)
- JEP 400: UTF-8 by Default (参照 2026-07-23)






