はじめに (対象読者・この記事でわかること)
この記事は、主に Eclipse で Java 開発を行っている中級者以上の開発者を対象としています。
数式処理や化学式、脚注を扱うアプリケーションを開発していて「なぜか上付き・下付き文字だけ文字化けする」という現象に悩まされている方は多いはずです。
この記事を読むことで、 Eclipse のコンパイル時に Unicode の上付き・下付き文字が「?」化するメカニズムと、設定一つで即解決する方法をマスターできます。
前提知識
- Java の基本的な文法が読めること
- Eclipse でプロジェクトを作成・ビルドできること
- 文字コード(UTF-8 / UTF-16 / CP1252 等)の違いを概ね理解していること
Eclipse のデフォルトエンコーディングが招く「?」の罠
Java 言語仕様上、ソースコード内で \u2082(下付き 2)や \u00B2(上付き 2)のように Unicode エスケープを使わず、文字そのものを書いてもコンパイルは可能です。
しかし、 Eclipse のワークスペースデフォルトエンコーディングが Windows-1252(=CP1252)などの 1 バイト系に設定されていると、上付き・下付き文字の一部は当該コードページに存在しないため、コンパイル時に「?」に置換されてしまいます。
この置換は javac のフェーズではなく、 Eclipse が内部でソースを 1 バイトエンコーディングに「正しく」変換しようとした時点で起こります。結果として .class 上も「?」のまま、実行時に表示を確認して初めて気づくという皮肉な事態を招きます。
上付き・下付き文字を正しく扱うための三つの手順
ステップ1:ワークスペースの文字エンコーディングを UTF-8 に統一
- メニューから「Window」→「Preferences」を開く
- 「General」→「Workspace」→「Text file encoding」を「UTF-8」に変更
- 「Apply and Close」を押して再起動
これだけで多くのケースが解決しますが、古いプロジェクト個別に別のエンコーディングが設定されていることもあるため、次のステップも実施しましょう。
ステップ2:プロジェクト固有のエンコーディングを確認/変更
- 該当プロジェクトを右クリック→「Properties」
- 「Resource」→「Text file encoding」で「Inherited from container」ではなく「UTF-8」を明示的に選択
- 「Apply」→「OK」
プロジェクトを Git 等で共有している場合、 .settings/org.eclipse.core.resources.prefs に encoding/<project>=UTF-8 の行が追加されるため、チーム内でも再現性が保たれます。
ステップ3:ビルド時の追加 JVM オプションを設定(オプション)
プロジェクトが古い Ant や独自ビルドを経由している場合、 javac の -encoding オプションが漏れると再び文字化けします。
「External Tools Configuration」または「Run Configuration」→「Arguments」タブで
-encoding UTF-8
を「VM arguments」に追記しておくと安全です。
ハマった点やエラー解決
- 現象:上記手順を実施しても「?」化が直らない
- 原因:ビルドパスに含まれる「ビルダー」が古い Shift-JIS 環境を引き継いでいた
- ログ:コンソールに「warning: unmappable character for encoding CP1252」が出力される
解決策
- 「Project」→「Properties」→「Builders」で、カスタムビルダーのエンコーディングも個別に UTF-8 を指定
- 不要なビルダーは無効化
- プロジェクトを「Clean」→「Build」し直す
これで Eclipse 上でも、CI サーバー上でも、同じソースが同じ文字として扱われるようになります。
まとめ
本記事では、 Eclipse で Java の上付き・下付き文字が「?」化する理由と、ワークスペース/プロジェクト/ビルドの 3 レベルで UTF-8 を明示する方法を解説しました。
- Eclipse のデフォルトエンコーディングは環境依存(Windows では CP1252)
- Unicode 補助漢字・上付き・下付き文字は CP1252 に存在しないため変換で消失
- エンコーディングの統一と
-encoding UTF-8の明示で完結
この記事を通して、日本語・記号・特殊文字を含むプログラムでも、思い通りの文字が表示される環境が手に入ります。
次回は、 Maven / Gradle プロジェクトでエンコーディングを CI レベルで担保する方法を紹介します。
参考資料
- Eclipse IDE Help「Setting encoding preferences」
- Unicode Consortium「Subscripts and Superscripts」
- Java Documentation「javac - encoding option」
- 伊藤直也・千葉滋『Java エンコーディング入門』技術評論社
