Javaのプログラムを書いたが、全角文字の部分でエラーが表示されてしまう


VSCode にて全角文字が使えるようになる対処法を教えてくださると嬉しいです。

[![全角文字部でエラーです。](https://i.stack.imgur.com/iRduh.png)](https://i.stack.imgur.com/iRduh.png)




Javaのソースコードの文字コードと環境やバージョンによって異なるコンパイラのデフォルトの文字コードの関係性を理解する必要があります。

Javaの文字列はUnicode文字列(正確にはUTF-16で内部的には16bitのchar配列)として扱います。ソースコードはUnicodeである必要は無く、(Javaがサポートしている)任意の文字コード(エンコード)にすることができ、コンパイル時にUnicode文字列に変換されます。問題はJavaのコンパイラ(javac)がどの文字コードがデフォルトで使うかですが、これは環境やバージョンによって異なります。

  * Java 17まで 
    * Windows環境: システムロケールの言語に対応した文字コード
    * Windows以外の環境: UTF-8
  * Java 18以降: UTF-8

この「システムロケールの言語に対応した文字コード」というのは、ANSIコードページとも言われます。システムロケールによって異なります。システムロケールはコントロールパネルの「地域」(「ファイル名を指定して実行」で`control
intl.cpl`を入力して起動) > [管理]タブ > [システム ロケールの変更(C)...] で開くダイアログで「現在のシステム
ロケール(C):」に指定された言語です。また、同じダイアログにある「ベータ: ワールドワイド言語サポートで Unicode UTF-8
を使用(U)」にチェックが付いているか以内かでも変わります。

  * 「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)」にチェックが無い場合(デフォルト):  
システムロケール毎に設定されている文字コード

  * 「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用(U)」にチェックが無い場合(デフォルト):  
UTF-8

「日本語 (日本)」の場合はコードページ932である
**[Windows-31J](https://www.iana.org/assignments/charset-reg/windows-31J)**
(「Windows-31J」はIANAでの登録名であり、別名として「CP932」「MS932」「windows-932」「csWindows31J」等があります。[Shfit_JIS](https://www.iana.org/assignments/charset-
reg/shift_jis)の亜種の一つであり、一部のコードがShift_JISとは異なります。)になります。(他の言語の文字コードは[コード
ページ識別子](https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-
identifiers)を参考にしてください。)

Windowsのメモ帳(notepad.exe)をはじめ、VSCode(Visual Studio
Code)等の多くのエディタではデフォルトの文字コードがUTF-8になっています。そのため、文字コードについて何も考慮せずにソースコードを書いた場合、UTF-8になっている可能性が高いです。しかし、Windowsの日本語環境、Javaのバージョンが17以下、という条件でJavaのコンパイルを行った場合、JavaのコンパイラはソースコードがWindows-31Jであるとみなします。ソースコードをWindows-31Jとして解釈し、Unicodeに変換できない文字列があると、今回のようなエラーが発生して、コンパイルに失敗します。

解決方法は四つです。

  1. Java 18以上にアップデートする。  
上に書いていることがよくわからないと言う場合は、これが最も簡単です。現在のバージョンのJavaをアンインストールして、LTSの最新バージョン(現在は21)をインストールしてください。

  2. Javaでコンパイル時にUTF-8を指定する。  
`javac -encoding UTF-8 Sample1.java` とコンパイラに`-encoding
UTF-8`オプションを付けてコンパイルします。このオプションで、javacはソースコードがUTF-8であることを認識し、コンパイル出来ます。

  3. システムローケールの設定でUTF-8にする。  
「ベータ: ワールドワイド言語サポートで Unicode UTF-8
を使用(U)」にチェックを入れることでWindowsの環境がUTF-8になり、Javaのデフォルトも文字コードがUTF-8になります。アップデートやオプション無しで、UTF-8をコンパイル出来ます。  
なお、「ベータ: ワールドワイド言語サポートで Unicode UTF-8
を使用(U)」はWindows全体に影響を与えるベータ機能であり、一部の古いアプリケーションで文字化けなどの不具合が発生する場合があります。自己責任で設定してください。

  4. VSCode以外を使って、「Windows-31J」で保存する。  
VSCodeはWindows-31Jに対応していません。VSCodeではなくメモ帳等の他のエディタを使用して、「Windows-31J」で保存してください。なお、メモ帳で名前を付けて保存するときに「エンコード」という選択する部分を「ANSI」に変えて保存すれば、(日本語環境では)Windows-31Jになります。ただし、この方法では、Windows-31Jでは表現不可な絵文字等はソースコードに書けなくなりますので、注意が必要です。

いずれ場合も、作成される.classファイル(Javaのバイナリ)内ではUnicode(UTF-16)として文字列が存在しますので、実行時に文字化け等が起きることはありません。

* * *

この回答は[過去の回答](https://ja.stackoverflow.com/a/56402)に加筆修正した物です。

