Charcle: UTF-8時代でも、EUC-JPやCP932のコードを触る人達へ
お疲れ様です、uzullaです。
私は最近、Charcleというコマンドラインツールを作成しました。このツールは、AI Codingなどにともなうエンコーディングの問題を解決するため、効率的も文字コード変換を行うツールです。
モチベーション: なぜCharcleを作ったのか?
UTF-8が主流になった今でもShift-JISやEUC-JPといったレガシーなエンコーディングがまだ使われている場面はあり、AIに処理させたり、ツールを活用する際に問題が頻発します。
たとえば、EUC-JPで書かれた古いコードを現代のUTF-8前提のツールで処理しようとしたとき、手動で変換するのは面倒ですし、エンコーディングのミスマッチで文字化けが発生すると大変に面倒です、手で直すのもうんざりします。
こうした課題を簡単に解決できるツールが必要だったのでCharcleを作ったきっかけです。
最初はFUSEとかでやろうかとおもったんですが、安定しなさそうなので素朴な方式にしました。
機能: Charcleができること
Charcleの主な機能は以下の通りです:
-
リアルタイムの双方向エンコーディング変換
UTF-8、Shift-JIS、EUC-JPなど、さまざまなエンコーディング間でのリアルタイム双方向変換が可能です。(Watchモード)charcle --watch /path/to/original /path/to/utf-8
オリジナル側を編集したら、変換側を更新しますし、変換側を更新したらオリジナル側に書き戻します。
-
エンコーディング自動検出
重要なことは、オリジナル側の文字コードを自動的に判定し、「UTF-8から書き戻す時、オリジナル側の文字コードを尊重する」ことです。これが必要な機能でした。大体のレガシー現場ではファイルのエンコーディングが混在します、UTF-8のファイルがまざっている場合が多いのです。なので、Charcleが自動で検出します。
-
バッチ処理
これはおまけなのですが、複数のファイルを一括で処理できます。大量のテキストファイルを扱うプロジェクトでも、charcle -f shift-jis /src /dest
のように一気に変換可能です。 -
exclude機能や、バイナリの透過
.git
や*.log
など、変換してほしくない(されてもうれしくない)ものは変換から除外できます。また、大きすぎるファイルも除外します。バイナリもそのままスルーします。
これらの機能のおかげで、Charcleはワークフローを大幅に効率化します、たぶん。
ユースケース: Charcleの実践的な使い方
では、Charcleがどんな場面で役立つのか、具体的なユースケースを見てみましょう。
1. AI Coding toolを使うとき
AI Coding Toolは大体UTF-8前提です、かれらにコードをかかせるとUTF-8で読み書きします。なのでCharcleを使えば透過的に対応が可能です。
.git は excludeオプションで排除しておくとよいでしょう、コミットはオリジナル側だけでやると思います。
2. Linterや、文字コード自動認識がしょぼいツールの活用
原因がエンコーディングのミスマッチだとわかっても、どのエンコーディングか特定するのは大変です。UTF-8側の処理だけをおこなえばOKです。
課題
UTF-8で扱えるemojiはEUC-JP等に戻すことは出来ません。その場合バイナリとして(EUC-JPなどには変換せず)に扱っています。一応エラーログは出力されるので、そこは人間が頑張ることになります。
これはどう扱うか迷うところですが、ロストしたり、気づかないよりはマシ、という思想です。
まとめ: Charcleでレガシー現場のエンコーディングの頭痛を減らす
「いまだUTF-8でない現場がなんであんの?」と言う声がきこえてきますが、すくなくとも俺の現場には有ります。
VSCodeにせよ、PhpStormにせよ、Editorはサポートしてくれてるんですが、Claude codeみたいなツールはちゃんとサポートしてくれないのでこういうのをつくるしかなかったんですよね。
文字エンコーディングの問題は慣れてしまえばどうとでもなる問題ですが、地味に時間を奪うものです。Charcleがあれば、悩みを減らせるかもしれません。
興味を持った方は、ぜひGitHubリポジトリをチェックして試してみてください。
まあ、正直個人的なツールなのでバグも多いかなとおもいますし、こうした方が使い勝手が良いとかあるかもしれませんが、もしお役にたてばどうぞ。
こちらからは以上です。
Discussion