🔄

Charcle: UTF-8時代でも、EUC-JPやCP932のコードを触る人達へ

に公開

お疲れ様です、uzullaです。

私は最近、Charcleというコマンドラインツールを作成しました。このツールは、AI Codingなどにともなうエンコーディングの問題を解決するため、効率的も文字コード変換を行うツールです。

https://github.com/uzulla/charcle


モチベーション: なぜCharcleを作ったのか?

UTF-8が主流になった今でもShift-JISやEUC-JPといったレガシーなエンコーディングがまだ使われている場面はあり、AIに処理させたり、ツールを活用する際に問題が頻発します。

たとえば、EUC-JPで書かれた古いコードを現代のUTF-8前提のツールで処理しようとしたとき、手動で変換するのは面倒ですし、エンコーディングのミスマッチで文字化けが発生すると大変に面倒です、手で直すのもうんざりします。

こうした課題を簡単に解決できるツールが必要だったのでCharcleを作ったきっかけです。

最初はFUSEとかでやろうかとおもったんですが、安定しなさそうなので素朴な方式にしました。


機能: Charcleができること

Charcleの主な機能は以下の通りです:

  1. リアルタイムの双方向エンコーディング変換
    UTF-8、Shift-JIS、EUC-JPなど、さまざまなエンコーディング間でのリアルタイム双方向変換が可能です。(Watchモード)

    charcle --watch /path/to/original /path/to/utf-8
    

    オリジナル側を編集したら、変換側を更新しますし、変換側を更新したらオリジナル側に書き戻します。

  2. エンコーディング自動検出
    重要なことは、オリジナル側の文字コードを自動的に判定し、「UTF-8から書き戻す時、オリジナル側の文字コードを尊重する」ことです。これが必要な機能でした。

    大体のレガシー現場ではファイルのエンコーディングが混在します、UTF-8のファイルがまざっている場合が多いのです。なので、Charcleが自動で検出します。

  3. バッチ処理
    これはおまけなのですが、複数のファイルを一括で処理できます。大量のテキストファイルを扱うプロジェクトでも、charcle -f shift-jis /src /destのように一気に変換可能です。

  4. 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