- JAVA
unmappable characterの直し方|javacの文字コード
error: unmappable character (0x9E) for encoding windows-31j は、javac が、ソースファイルを指定とは違う文字コードで読もうとしたときのエラーです。 日本語の環境では、次のように表示されます。
W.java:1: エラー: この文字(0x9E)は、エンコーディングwindows-31jにマップできません
ソースファイルの文字コードと、javac に伝えている文字コードを合わせれば直ります。
| エラー文の encoding | 起きている状況 | 直し方 |
|---|---|---|
for encoding windows-31j |
UTF-8 で保存したソースを、windows-31j(Shift_JIS 系)として読んだ | javac -encoding UTF-8、Maven・Gradle に UTF-8 を指定 |
for encoding UTF-8 |
Shift_JIS で保存したソースを、UTF-8 として読んだ(JDK 18 以降に上げたときなど) | ソースを UTF-8 に変換する、または -encoding windows-31j |
for encoding ASCII |
文字コードが ASCII の環境(Linux の C ロケールなど)で、文字コードを指定せずに JDK 8 で javac した | -encoding UTF-8 |
確認環境:OpenJDK 8・11・17・21・25(Linux)で、-encoding を指定して再現しました。日本語のメッセージは -J-Duser.language=ja で表示しました(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「unmappable characterの直し方|javacの文字コード」
再現① UTF-8 のソースを windows-31j で読む
public class W { public static void main(String[] a){ System.out.println("日本語"); } }
UTF-8 で保存したこのファイルを、javac -encoding windows-31j W.java でコンパイルしました。
W.java:1: error: unmappable character (0x9E) for encoding windows-31j
public class W { public static void main(String[] a){ System.out.println("??????"); } }
^
| JDK | 結果 |
|---|---|
| 8 | error: unmappable character for encoding windows-31j(バイトの値は表示されない) |
| 11・17・21・25 | error: unmappable character (0x9E) for encoding windows-31j |
どの版でもエラーで、class ファイルは作られませんでした。 (0x9E) は、windows-31j として読めなかったバイトの値です。コメントの中の日本語でも、同じエラーになりました(// 日本語のコメント → unmappable character (0x81))。
エラーにならずに、文字化けすることがある(要注意)
同じ条件でも、文字によってはエラーにならず、文字化けしたまま class ファイルが作られました。
| 書いた文字列 | javac の結果 | 実行して表示された文字 |
|---|---|---|
こんにちは |
成功 | 縺薙s縺ォ縺。縺ッ |
挨拶を表示する |
成功 | 謖ィ諡カ繧定。ィ遉コ縺吶k |
エラー |
成功 | 繧ィ繝ゥ繝シ |
日本語 |
error(0x9E) | ― |
合計金額 |
error(0x8D) | ― |
髙橋・①② |
error | ― |
UTF-8 のバイトの並びが、たまたま windows-31j の文字として読めると、エラーにならずに別の文字に変わります。 画面や帳票に「縺」「繧」などが並んでいたら、この形を疑います。エラーが1つでも出たら、警告を消すのではなく、文字コードの指定を直すのが正しい対処です。
再現② Shift_JIS のソースを UTF-8 で読む(JDK 18 以降で起きやすい)
Shift_JIS(cp932)で保存したソースを、JDK 21 で文字コードを指定せずにコンパイルしました。
S.java:3: error: unmappable character (0x93) for encoding UTF-8
System.out.println("???{??");
^
JEP 400 により、JDK 18 から Java の既定の文字コードは UTF-8 になりました。 JEP 400 では、javac は -encoding を指定しない限り既定の文字コードでソースを読むと説明され、影響が大きいのは「アジアのロケールの Windows を使う人」とされています。以前の版の JDK で、Windows の既定(windows-31j)のまま書いてきたソースを、JDK 18 以降でコンパイルすると、このエラーになります。
| 直し方 | 結果(確認環境) |
|---|---|
ソースを UTF-8 に変換(iconv -f CP932 -t UTF-8、エディタで保存し直す) |
指定なしでコンパイルでき、日本語 と表示された |
当面 javac -encoding windows-31j を付ける |
コンパイルでき、日本語 と表示された |
長く使うプロジェクトなら、ソースを UTF-8 にそろえるほうが、ほかのツール(Git・IDE・CI)とも合わせやすくなります。
Maven・Gradle での指定
Maven
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
maven-compiler-plugin の encoding の既定値は ${project.build.sourceEncoding} です(プラグインのドキュメント)。この1行で、javac に -encoding UTF-8 が渡ります。
Gradle
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}
確認環境の Gradle 8.14.3 で options.encoding = 'windows-31j' にすると同じ unmappable character (0x9E) になり、'UTF-8' に直すとコンパイルできました。 Gradle のドキュメントでは、encoding を指定しない(null)と、プラットフォームの既定の文字コードが使われると説明されています。
IDE で動くのに、Maven・Gradle(CI)で止まるときは、ビルドの設定に文字コードが書かれていないことがあります。ビルドの書き方は、既存の記事「Mavenコマンド一覧|pom.xml書き方とよく使うオプション」「build.gradle書き方|Groovy/Kotlin DSL対訳と依存設定一覧」で扱っています。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | エラー文の for encoding ○○ |
javac がどの文字コードで読んだか |
| 2 | ソースファイルの本当の文字コード | エディタの表示、file -i W.java |
| 3 | JDK の版 | 18 以降は既定が UTF-8 |
| 4 | ビルドの設定 | project.build.sourceEncoding、options.encoding |
| 5 | 画面に「縺」「繧」が出ていないか | エラーにならない文字化け |
よくある質問
Q. 実行したときの文字化け(System.out の表示)とは違いますか。
A. 違います。このエラーはコンパイルのときのものです。確認環境でも、正しくコンパイルできたあと、端末の文字コードによって表示が ??? になることがありました。表示の文字コードは、JDK 18 以降なら -Dstdout.encoding=UTF-8 で指定できました。
Q. ファイルを読むときの文字化けは。 A. 実行中にファイルを読むときの文字コードは別の話です。関連記事の「MalformedInputExceptionの直し方|Java文字コード」で扱っています。
まとめ
- ソースファイルの文字コードと、javac の
-encodingが違うエラー for encoding windows-31jは UTF-8 のソースを Shift_JIS 系で読んだ、for encoding UTF-8はその逆- 文字によってはエラーにならず「縺薙s縺ォ縺。縺ッ」のように化ける
- JDK 18 から既定が UTF-8(JEP 400)。以前の Shift_JIS のソースで止まる
- Maven は
project.build.sourceEncoding、Gradle はoptions.encoding
参考・出典
確認日はいずれも 2026年10月11日です。
- JEP 400「UTF-8 by Default」:https://openjdk.org/jeps/400
- Apache Maven Compiler Plugin「compiler:compile」(encoding):https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html
- Gradle DSL Reference「CompileOptions」(encoding):https://docs.gradle.org/current/dsl/org.gradle.api.tasks.compile.CompileOptions.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「unmappable characterの直し方|javacの文字コード」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。