| この記事の要点 |
|
このエラーの典型
C:\src> javac Hello.java
Hello.java:3: 警告: この文字は、エンコーディングMS932にマップできません。
System.out.println("?????????");
^
Hello.java:5: 警告: この文字は、エンコーディングMS932にマップできません。
// ?????????????????
^
警告4個
原因: Hello.java は UTF-8 で保存されているが、javac は OS 既定の MS932 (Shift_JIS) で読もうとしている → UTF-8 のバイト列を Shift_JIS として解釈できず警告。
対処 1: コマンドラインで -encoding 指定
# UTF-8 ソースを UTF-8 として読ませる
javac -encoding UTF-8 Hello.java
# 複数ファイル
javac -encoding UTF-8 -d build src/**/*.java
# Java 18 以降は javac 既定が UTF-8 になったので不要だが、
# 移植性を考えると明示推奨
javac --release 17 -encoding UTF-8 Hello.java
対処 2: 環境変数で固定
# Linux / macOS の bash / zsh
export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8"
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
# Windows PowerShell
$env:JAVA_TOOL_OPTIONS = "-Dfile.encoding=UTF-8"
# Windows コマンドプロンプト(コードページも変える)
chcp 65001
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
対処 3: Maven
<!-- pom.xml -->
<project>
<properties>
<!-- これだけで compiler / resources / surefire 等が UTF-8 になる -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
対処 4: Gradle
// build.gradle
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
tasks.withType(Javadoc) {
options.encoding = 'UTF-8'
}
tasks.withType(Test) {
systemProperty 'file.encoding', 'UTF-8'
}
// Kotlin DSL (build.gradle.kts)
tasks.withType<JavaCompile>().configureEach {
options.encoding = "UTF-8"
}
対処 5: IDE 設定
| IDE | 設定場所 |
|---|---|
| IntelliJ IDEA | File → Settings → Editor → File Encodings → Global / Project / Default を全部 UTF-8、Transparent native-to-ascii conversion はオフ |
| Eclipse | Window → Preferences → General → Workspace → Text file encoding: UTF-8、+ Project Properties → Resource でも UTF-8 |
| VS Code | files.encoding: utf8、files.autoGuessEncoding: true |
| NetBeans | Tools → Options → Miscellaneous → Files → Default Encoding: UTF-8 |
実行時の文字化けは別問題
コンパイル時に解決しても、実行時の標準出力が化けるケースがあります:
# 実行時のデフォルトエンコーディング指定
java -Dfile.encoding=UTF-8 Hello
# JAVA_TOOL_OPTIONS は java / javac 両方に効く
export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8"
# Java 18+ は既定 UTF-8 (JEP 400)
# それ未満は明示が必要
# Windows コマンドプロンプトでは
chcp 65001
java -Dfile.encoding=UTF-8 Hello
BOM 付き UTF-8 の罠
Windows の「メモ帳」で保存するとBOM (0xEF 0xBB 0xBF) が先頭に付くことがあり、javac はこれを解釈できずエラー:
Hello.java:1: エラー: 不正な文字: ''
?package com.example;
^
対処: BOM 無し UTF-8 で保存。VS Code / IntelliJ / sublime はメニューから設定可。
確認: ファイルの実エンコーディング
# Linux / macOS
file Hello.java
# Hello.java: UTF-8 Unicode text
# hexdump 先頭で BOM 確認
xxd Hello.java | head -1
# 00000000: efbb bf70 ... ← BOM 付き
# 00000000: 7061 636b ... ← BOM 無し
# nkf で文字コード判定 (要インストール)
nkf -g Hello.java
# UTF-8
# nkf で変換
nkf -w --overwrite Hello.java # UTF-8 へ
nkf -s --overwrite Hello.java # Shift_JIS へ
Java 18 以降の変更 (JEP 400)
Java 18 から標準 charset がプラットフォーム既定から UTF-8 固定に変わりました:
Charset.defaultCharset()が UTF-8 を返すFileReader/FileWriter/PrintStreamも既定 UTF-8- 旧挙動に戻すには
-Dfile.encoding=COMPAT - 新規プロジェクトは Java 17 LTS / 21 LTS で書くのが安全
FAQ
Q: ? に化けてしまったソースを救えるか
A: 一度文字情報が失われたら復元不能。バックアップから取り直すか、再入力。
Q: log4j / System.out で文字化け
A: ログ設定ファイルに charset 指定、コンソールアペンダのエンコーディングを UTF-8 に。
Q: war 内の properties が化ける
A: maven-resources-plugin の encoding を UTF-8 に。ResourceBundle は Java 9 以降 UTF-8 がデフォルト。
子ページ
子ページはありません
同階層のページ
- java.lang.NoSuchMethodError
- java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
- java.lang.UnsupportedClassVersionError
- version less than X.X is not supported.
- パッケージ~は存在しません
- org.apache.jasper.JasperException: ...The jsp:param action must not be...
- java.io.FileNotFoundException: ファイル名 (許可がありません)
- java.sql.SQLException: Cannot convert value 'YYYY-MM-DD ...' from column n(YYYY-MM-DD ...) to TIMESTAMP.
- 警告: この文字は、エンコーディング[文字コード]にマップできません
- java.text.ParseException: Unparseable date
- Unsupported major.minor version 52.0
- エンティティ" ... "への参照は';'デリミタで終了する必要があります。
- java.math.BigDecimal cannot be cast to java.lang.String
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38