文字化け (繧エ繝� / ã®ã / ?????) を解読・元の日本語に戻す方法
「繧ウ繝シ繝�」「ã®ã」「???」のような文字化けテキストを、ブラウザ内だけで元の日本語に復元する手順。Shift_JIS / EUC-JP / UTF-8 / ISO-2022-JP の誤読パターンを総当たりで試し、復元候補を並べます。
なぜ「繧エ繝�」や「ã®ã」になるのか
文字化けは、テキストが書かれたときのエンコーディングと、読み手側で仮定したエンコーディングが食い違うと発生します。代表的なパターンは 3 つです。第一に、UTF-8 で保存された日本語を Shift_JIS として読むケース。これが「繧ウ繝シ繝ウ」のような全角カタカナ風の化け方になります。第二に、UTF-8 を Latin-1 (ISO-8859-1) として読むケースで、「ã®ã」「éè」のような欧文アクセント記号風の文字列が並びます。第三に、Shift_JIS で書かれた CSV を UTF-8 として読み込んで「?」が連発するケース。
実用上、これは古い CSV エクスポート (Excel から書き出した日本語 CSV)、メールの Subject ヘッダ、レガシーシステムからの API レスポンス、Mac ↔ Windows 間でのファイル送付、Shift_JIS で書かれた古い HTML をブラウザが UTF-8 と決め打ちしたケースで起きます。「壊れた」のではなく「読み方を間違えただけ」なので、化けた文字列のバイト列を逆方向にデコードし直せば元に戻ります。これを総当たりで試すのが mojibake-fix のしごとです。
ブラウザに貼り付けて復元する手順
mojibake-fix を開き、化けている文字列をそのまま入力欄にコピー & ペーストします。ツールは内部で (source → misread) のエンコーディングペアを総当たりで試します。具体的には UTF-8 → SJIS、UTF-8 → EUC-JP、UTF-8 → Latin-1、SJIS → UTF-8、SJIS → EUC-JP、EUC-JP → UTF-8、EUC-JP → SJIS、Latin-1 → UTF-8 の組み合わせを順に検証し、それぞれの復元結果に「日本語らしさスコア」を付けて降順で並べます。
スコアは「ひらがな・カタカナ・常用漢字の出現比率」「制御文字や私用領域 (Private Use Area) の少なさ」「『繧』『繝』『邊』のような典型的な化けバイト列が消えているか」などの指標で計算されます。多くの場合、上位 1〜2 件のどちらかが正解です。複数候補が並ぶときは、文脈に合うほうを選んでクリップボードへコピー。CSV の場合は復元先のエンコーディングを指定して別形式で書き出すために csv-encoding-convert と組み合わせると、ファイル単位の修正がそのまま完結します。
総当たりが効く理由とエンコーディングの内部構造
総当たりが現実的な計算量で済むのは、日本語環境で使われるエンコーディングがおよそ 4〜5 種類に収まるからです。Unicode (UTF-8 / UTF-16)、Shift_JIS (CP932 含む)、EUC-JP、ISO-2022-JP (JIS)、Latin-1 (ISO-8859-1) のペアだけ試せばカバー率はほぼ 100 %。各組み合わせで「文字列 → 一旦バイト列 → 別エンコーディングで再解釈」を実行し、結果が日本語として成立するか判定します。
実装側では encoding-japanese を使って Unicode ↔ Shift_JIS / EUC-JP の変換を行い、Latin-1 は単純なバイト ↔ コードポイント対応で処理します。各エンコーディングのバイト構造には固有の癖があり、Shift_JIS は 0x81-0x9F / 0xE0-0xFC が 2 バイト文字の先頭バイト、EUC-JP は 0xA1-0xFE 範囲、UTF-8 は 0xC2-0xF4 が複数バイト文字の開始 — これらのパターンが噛み合わない場合は変換失敗 (null) を返し、候補から除外します。
化けた文字列をどこに貼ってよいか
文字化け復元の Web サービスは数多くありますが、入力欄に貼った文字列がサーバーへ送信される実装が多数派です。本来読めるはずだったのは「氏名」「住所」「メール本文」「契約番号」「顧客の発注内容」など、組織内で取り扱いに注意が必要なテキストであることが珍しくありません。化けていても元のデータには違いがなく、復元できれば普通に意味のある個人情報・業務情報に戻ります。
mojibake-fix は貼り付けた文字列を encoding-japanese と素の JavaScript だけでブラウザ内で総当たり試行し、結果も同じタブで表示するだけです。外部 API は呼ばず、DevTools の Network タブを開いたまま操作しても本文に関連する HTTP リクエストは流れません。実装は GitHub で公開されています。CSV ファイル丸ごとの文字コード変換は csv-encoding-convert、Unicode の正規化 (NFC / NFKC) なら unicode-normalize、1 文字単位でコードポイントを調べたい時は unicode-inspect を同じ思想で使えます。