4
2

コマンドプロンプトでJavaプログラムを実行した際に文字化けで困った話

Posted at

皆様こんにちは。
Javaを勉強し始めの方は、初めてのアウトプットとしてまず1コマンドラインアプリを制作することが多いのではないでしょうか。
先日Javaで作ったプログラムを初めてコマンドプロンプトで実行した所、一部が文字化けしてしまったのですが、一先ずは解決できたためその時のことを書いていきたいと思います。

Javaプログラムを作ってみる

まず前提として、私はEclipseという2IDEを用いて開発しています。
Java開発においてはポピュラーな環境なので使われている方も多いのではないでしょうか。
Visual Studio Code等他のコードエディタで開発している場合は状況が異なるかもしれませんのでその点ご了承ください。

さて、では名前を入力すると挨拶を返してくれる簡単なプログラムを作ってみます。
下記のようにコーディングします。

Main.java
public class Main {

	public static void main(String[] args) {
		System.out.println("あなたの名前を教えてください");

		String name = new java.util.Scanner(System.in).nextLine();
		
		System.out.println("こんにちは!" + name + "さん!");
	}

}

次にこのプログラムをEclipse上のコンソールとWindowsのコマンドプロンプトそれぞれで実行してみます。

Eclipse
挨拶アプリEclipse.gif

コマンドプロンプト
挨拶アプリcmd.gif

このようにEclipseのコンソールでは入力した名前が問題なく表示されましたが、コマンドプロンプトでは文字化けで表示されてしまいます。
どうすれば解決できるでしょうか?

標準入力(System.in)の文字コードを明示的に指定する

ネットで調べてみたところ、Javaのデフォルト文字コードとコマンドプロンプトの文字コードが異なっていることが原因のようです。
Javaのデフォルト文字コードとコマンドプロンプトの文字コードはそれぞれ、

Java:Unicode(UTF-16)
コマンドプロンプト:Shift_JIS

となっています。
そのためJavaに入力(System.in)する際、文字コードがShift_JISであることを明示的に指定すれば解決できそうです。
下記のようにコードを修正します。

Main.java
public class Main {

	public static void main(String[] args) {
		System.out.println("あなたの名前を教えてください");

		//System.inの後に「, "Shift-JIS"」を追記
		String name = new java.util.Scanner(System.in, "Shift-JIS").nextLine();
		
		System.out.println("こんにちは!" + name + "さん!");
	}

}

では、改めてコマンドプロンプトで実行してみましょう。

コマンドプロンプト
挨拶アプリcmd修正.gif

文字化けせずに表示させることができました。

まとめ

いかがだったでしょうか。
こういった文字化けへの対処方法は色々とあるようですが、今回はコードに追記することで解決することができました。
ただし、開発環境と実行環境の違い等に対する理解が私自身まだ乏しく、根本的な解決のためにはより学習を深めていく必要があると実感しました。
今回はここで終わりになりますが、少しでも皆様の参考になれば幸いです。

参考

  1. コマンドプロンプトやPowerShell等を使用し、文字によって操作や表示を行うアプリケーション。

  2. 統合開発環境(Integrated Development Environment)。コーディング、実行、デバッグ等、開発に必要な作業を一つのソフトウェアで完結できるため効率がよく、多くの現場で採用されている。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2