質問: やさしいJavaを使って勉強を始めたのですが、うまくいきません。どこが間違っていますか?![画像の説明をここに入力](https://i.stack.imgur.com/ECAPD.png) Cドライブ直下への移動がちゃんとできているかわからないですけどエラーになってしまいました。 ![画像の説明をここに入力](https://i.stack.imgur.com/J3NCn.png)
回答: 二つ目の画像のエラー「この文字は、エンコーディングMS932にマップできません」について原因の解説と対処法を書きます。(一つ目の画像はhinaloeさんの回答の通りなので) Java自体の文字列はUnicode文字列(正確にはUTF-16で内部的には16bitのchar配列)として扱いますが、ソースコードはUnicodeである必要は無く、(Javaがサポートしている)任意の文字コードにすることができ、コンパイル時にUnicode文字列に変換されます。問題はどの文字コードが使われるかですが、これは環境によって異なり、Windowsの日本語環境では、Javaはデフォルトではソースコードの文字コードがWindows-31J(別名としてMS932やCP932と言われるShift_JISの亜種、Shift_JISそのものでは無い)であるとしてコンパイルを行います※。もし、ソースコードの文字コードがWindows-31Jでなかった場合、Windows-31Jとして解釈し、Unicodeに変換できない文字列があると、今回のようなエラーが発生して、コンパイルに失敗します。 ※ Windows以外や日本語以外の環境では別の文字コードがデフォルトになる。 ということで、ソースコードの文字コードがJavaが想定している文字コードにすれば良いのですが、ここにWindowsのメモ帳(notepad.exe)の文字コードが何であるかが、Windowsのバージョンによって異なるという罠があります。 Windows 9x以前のメモ帳では、Windowsで「ANSI」と呼ばれる文字コードにしか対応していませんでした。このWindowsでの「ANSI」は「その環境のロケールで使われる文字コード」を表し、日本語環境の場合は、先程出てきたWindows-31Jになります※。つまり、Windows 9x以前のメモ帳を使ってソースコードを各場合、文字コードはWindows-31Jになるため、今回のエラーは起きないはずです。**書籍によっては、ソースコードの作成にメモ帳を使った方法が書いてありますが、Windows 9x以前のメモ帳を使用した場合であり、デフォルトで設定される文字コードがJavaとメモ帳で同じであるという暗黙の前提があるからです。** ※ 日本語以外の環境では別の文字コードが「ANSI」になる。 Windows 2000以降のメモ帳では、「ANSI」に加えて、BOM付UTF-8、UTF-16LE、UTF-16BE、BOMなしUTF-8(Windows 10 1903から)のUnicodeの文字コードが対応に追加されました。ただし、Windows 8.1以前では、デフォルトは「ANSI」だったので作成した場合に問題になることはありませんでした。しかし、「ANSI」であるWindows-31Jは、絵文字などの新しくUnicodeで追加された文字が使えません。そのような文字が含まれる場合は、Unicodeの文字コード保存するように警告を出すようにしていました。それでも、通常の文章でそのような文字が含まれることは希なため、**Windows 8.1以前のメモ帳を前提にすれば、問題ない**として修正していない書籍も少なからずありました。 Windows 10から、Microsoftは方針を変えました。「ANSI」は互換性のために残された古い技術であり、環境依存(ロケールが異なると異なる)かつ全ての文字に対応しないなど問題があります。そこで、デフォルトの文字コードをBOM付UTF-8に変更したのです(Windows 10 1903からはBOMなしUTF-8)。つまり、Windows 10でメモ帳を使用してソースコードを書いた場合、BOM付UTF-8(またはBOMなしUTF-8)になってしまうと言うことです。Javaは依然としてソースコードがWindows-31Jであることがデフォルトになっているため、文字コードが一致せず、コンパイルエラーが発生してしまうのです。 解決方法は二つです。Windows-31Jであわせるか、UTF-8であわせるかです。 1. メモ帳で「ANSI」で保存する。 メモ帳で名前を付けて保存するときに、「文字コード」という選択する枠が「保存」ボタンの左にあるはずです。ここを「ANSI」に変えて保存すれば、(日本語環境では)Windows-31Jになります。ただし、この方法はWindows-31Jでは表現不可な絵文字等はソースコードに書けなくなりますので、注意が必要です。 2. Javaでコンパイル時にUTF-8を指定する。 `javac -encoding UTF-8 Sample1.java` と言うように`-encoding UTF-8`オプションを付けてコンパイルします。このオプションで、javacはソースコードがUTF-8であることを認識し、コンパイル出来ます。BOM付UTF-8でもBOMなしUTF-8でも大丈夫なはずです(今手元にJavaがないので試せてない)。 Windows以外のOSはかなり前からUTF-8がデフォルトであり、今後ますますUTF-8がデファクトスタンダートになると思われますので、対応としてはこちらの方をお勧めします。 いずれ場合も、作成される.classファイル(Javaのバイナリ)内ではUnicode(UTF-16)として文字列が存在しますので、実行時に文字化け等が起きることはありません。 ちょっと、何がどのWindowsのバージョンから対応というのは調べ切れていないので間違いあるかも知れません。間違いがある場合は、ご指摘をお願いします。