はじめに
この記事は2025年Java Advent Calendar、12月23日のエントリーです。
発端
それは2021年の春のある日のこと。
たぶん、その時点ですでにVisual Studio Codeはあったし使っていたと思います。
ただ、いろんな意味でツールは複数比較しながら使ってみたかった私はAtomもインストールしていました。AtomでJavaのコードを書いてコンパイルして動作させるためにはscript(atom-script)という拡張が使われていました。これはJavaだけではなく複数言語のソース編集画面からコンパイル実行する機能でした。Javaのソースを編集している画面からCtrl+Shift+Bというキー操作でコンパイルして実行します。ビルド、というにはちょっと簡単すぎる仕様。
使い始めてすぐに気がついたのは、javacのメッセージもjavaの実行結果も文字化けする、という事実。開発中のコードですのでエラーも警告も出るわけですが一切読めない。まあ実行させた出力も文字化けしているわけですが、こっちは制御不可能なわけではないので、問題ないと言えば問題ない。コンパイラの出力の文字コードはよほどでないといじれません。
これは推測ですが、Atomのターミナル画面は文字コードUTF-8決め打ちだったのだと思います。実際にはCMD.EXEの出力文字コードはASNIだったので、それを間違ってUTF-8として解釈して表示しようとして文字化けしていたのだと思います。
当時の状況
当時、このことは、もちろん日本の開発界隈では問題になっていて、幾度もいろんなサイトに質問が投稿されていました。(例1、例2) 当時、解決策とされていたのは、process.env.JAVA_TOOL_OPTIONS = '-Dfile.encoding=UTF-8'をinit.coffeeに追記すること、でした。しかし、これはjava実行時の入出力のデフォルトエンコーディングをUTF-8にするだけ、のものです。これで運用すると何が起こるかというと、
- javacの文字コードはOSデフォルト(ANSI=日本語WindowsではMS932≒基本的にはシフトJIS)のまま
なわけです。javacのための環境変数を別途用意するというのもうまくいってなかった。
過去の経緯
この件は2016年にatom-community/atom-scriptにおいて、The Atom script package requires script execution screen encoding in Java #1166ですでに問題として報告されています。atom自体はそこそこ有名プロジェクトだったわけですから、世界中で使ってる人はいたわけで、まあ気がつく人はきがつきますよね。
しかし、このissue、途中で「そうなんだよね、pythonでも文字化けするんだよね」というコメントがつき、「pythonではこうすると直るよ」というコードが投稿され、fix: set utf-8 encoding for Python #2421というissueに引き継がれました。
ここでpythonの問題は解決したところで、いったんcloseされてしまいました。
あれ?Javaどこ行った?
それじゃ駄目でしょ
ということで、issue #1166に「いやいや、本来のJavaの問題って解決してないよね?」というコメントを突っ込みました。結果、このバグは再openされ、再び議論が始まりました。
とりあえずJavaのビルドをどこでやっているかというコードの場所を教えてもらいました。Javascriptは殆ど忘れていましたが、まあそんなに難しくありません。コード修正して手許で動くことを確認して生まれて初めてのgithubのPull Requestを投げました。
しかし最初のpull requestは受け付けられて本体にマージされたのですが、肝心なところが改変されてマージされてしまいました。つまり問題を解決しないコードがマージされてしまったのです。理解できないのなら質問してくれればよかったのに…。指摘するコメント
ということでもう一度やりとりをしました。結論から言うと、javacには-J-Dfile.encoding=UTF-8を与えればよかったのですが、先方で勝手に「これって-encoding UTF-8と同じ意味なのでは?」と解釈し変更しようと提案してきたりしました。おまえら人の話はちゃんと聞きなさい。
やりとりの結果「-J-Dfile.encoding=UTF-8でないと駄目」までは伝わったようなのですが、「え?でも念のため-encoding UTF-8と-J-Dfile.encoding=UTF-8両方つけとくね」という結果になりました。頑固だな、しかも正しくないのに。まあこの辺はjavacのオプションの効く範囲が複雑なのも問題だとは思いますが。
あくまで過去のことなので
まあその後 #JEP400 が入ったのと、Atom自体がEOLになってしまったのでいまさらどうでもいいのですが、これは、文字コードについていかに理解されていないかということを物語っていると思います。テキストエディタなんていう文字コードの扱いが最重要と思われるようなプロジェクトに関わっている界隈ですらこうなので…今後もいろんなところで問題が起こるんじゃないかなと思います。非英語話者に取ってはまだまだ戦いは続くということです。たぶん。
追記
Pulsar Editというatom派生プロジェクトが今も活きていて、atom-scriptもそこで使えるというのを聞いたので、試してみましたが…問題動作を再現できませんでした(笑)。修正箇所が活きてるのかもよくわからず。たぶん文字化けはおこらない…と思う。