その化け方には、名前がある。
どの文字コードを、どう読み違えたのか。
文字化けは、ランダムに壊れているわけではありません。どの文字コードで書かれたバイト列を、どの文字コードだと思って読んだか——その組み合わせごとに、決まった見た目になります。見慣れれば、化けた文字を見ただけで原因の見当がつきます。ここでは正しい文字列から化け方を再現し、逆に化けた文字列から原因を推定して復元します。すべてブラウザ内で処理しています。
元の変換で文字が失われている場合(? や □ になっている場合)は、原理的に元へ戻せません。復元できるのは「バイト列は無事だが読み方を間違えた」種類の化けだけです。
コンピュータが保存しているのは文字ではなくバイトの並びです。「東」という文字をどのバイトで表すかは文字コードごとに違い、UTF-8では3バイト、Shift_JISとEUC-JPでは2バイトになります。
ここで、書いたときと読むときで文字コードの想定がずれると、同じバイト列が別の区切りで解釈されます。3バイトずつ並んだものを2バイトずつ読めば、文字の切れ目そのものがずれる。結果として、意味のない漢字や記号が延々と並びます。データは壊れていません。読み方だけが間違っている——だから正しく読み直せば元に戻ります。
やっかいなのはもう1種類、変換の時点で文字が失われる化けです。絵文字やサロゲートペア(𠮷・𩸽)はShift_JISに存在しないため、Shift_JISへ変換した瞬間に捨てられて ? になります。こちらは後から復元できません。入力欄で弾くか、最後までUTF-8で通す必要があります。実際にどの文字が落ちるかは 意地悪テストデータ生成器 の文字種カタログで試せます。
どの文字が変換で落ちるかを確かめたいときは 意地悪テストデータ生成器、入力欄まわりの観点は TESTパターン集、バリデーションの正規表現は 正規表現テスター をどうぞ。