以下のような事情があります。
- 日本語版Windowsでの、JavaのデフォルトエンコードはWindows-31J(Shift_JISの亜種、別名CP932、MS932)です。
- javacによるコンパイルでは、オプション等をしていない場合、ソースコードがデフォルトエンコードでエンコードされていると想定します。自動的に認識はしてくれません。
- 日本語版Windowsでの、メモ帳の「ANSI」はWindows-31Jです。「Unicode」はBOM付きUTF-16(Little Endian)、「Unicode big endian」はBOM付きUTF-16(Big Endian)、「UTF-8」はBOM付きUTF-8です。なお、Unicode系はBOM付きです。
- 絵文字「????」や一部の漢字「????」などはWindows-31Jに含まれていないため、メモ帳では「ANSI」で保存できません。
- 基本的にひらがなはWindows-31Jに含まれているため、メモ帳では「ANSI」で保存できます。しかし、ごく一部の特殊なひらがな「ゔゕゖ」はWindows-31Jに含まれていないため、「ANSI」で保存できません。
まず、コンパイルエラーになるのはjavacがWindows-31Jであるという前提でソースコードを読み取ろうとするからです。Windows-31Jには存在しない文字が見つかった場合、javacはエラーになり、コンパイルに失敗します。これを防ぐにはjavacの実行時に-encoding
オプションでエンコードを指定する必要があります。
UnicodeまたはUnicode big endianで保存した場合に対応(どちらのEndianかはBOMより自動判別してくれます)
javac -encoding UTF-16 Sample.java
UTF-8で保存してしまった場合ですが、javacはBOM付きUTF-8を扱うことはできません。ですので、BOM無しUTF-8にする必要があるのですが、メモ帳はBOM無しUTF-8で保存することができません。メモ帳でUTF-8で保存したJavaのソースコードを直接javacでコンパイルする方法は存在しません。
なお、ひらがながあるとANSIで保存できなかったとのことですが、上で挙げた通り一部のひらがなはWindows-31Jになく、ANSIで保存できません。そのごく一部のひらがなが含まれてしまっていたと推測されます。
以上ですが、シンタックスハイライトをしてくれないなどメモ帳でのコーディングには限界がありますので、コーディングに適した高機能なエディタやIDEを使うことをお勧めします。