直せる文字化けと、直せない文字化け
文字化け・文字コードのコラム
文字化けしたテキストは、変換をやり直せば必ず元に戻る。
そう思われがちですが、実際には戻せるものと、どうやっても戻せないものがあります。
MojiRescueを作る過程で確認した内容なので、少し踏み込んで書いてみます。
文字化けが起きる仕組み
文字は、コンピューターの中ではバイトという数値の並びとして保存されています。
「どの数値をどの文字として扱うか」の取り決めが文字コードで、保存したときと違う取り決めで読み出すと、別の文字として表示されます。これが文字化けです。
裏を返せば、読み間違えただけで数値そのものが残っているなら、正しい取り決めで読み直せば元に戻ります。
文字化けが直せるのは、この場合です。
戻せなくなるのはどんなときか
問題は、読み間違えた結果が「その文字コードでは表現できない並び」だったときです。
多くのソフトは、解釈できないバイトに出会うと、それを「」(判別不能を示す記号)に置き換えます。
このとき、元のバイトは捨てられます。
表示のうえでは同じような文字化けに見えますが、中身はすでに空っぽになっています。
実際に試してみると、失われ方の大きさが分かります。
「東京都」をShift_JISで保存し、それをEUC-JPとして読み込むと、結果はこうなりました。
s
3文字が、アルターン1文字だけになりました。
この状態から「東京都」を復元する方法はありません。存在しないものは戻せない、という話になります。
戻せるかどうかは「何として読んだか」で決まる
いろいろな組み合わせを試したところ、復元できるかどうかは、元が何だったかよりも何として読まれたかでほぼ決まるようでした。
- 欧文用の文字コード(Latin-1・Windows-1252)として読まれた場合: ほぼ完全に復元できます。この方式はすべてのバイトに文字が割り当てられているため、捨てられるバイトが出ません。「ã」「æ」が並ぶタイプの化けがこれにあたります。
- Shift_JISやEUC-JPとして読まれた場合: 部分的に復元できることもありますが、欠落が出ます。
- UTF-8として読まれた場合: ほぼ絶望的です。UTF-8はバイトの並び方の規則が厳格なため、他の文字コードのデータを読ませると大半が不正と判定され、捨てられます。「?????」だらけになるのはこのためです。
画面のコピペより、元ファイルのほうが確実
ここまでの話には、ひとつ抜け道があります。
元のファイルさえ手元にあれば、この問題は起きません。
失われるのは、あくまで「化けた状態で画面に表示された文字」をコピーした場合です。
ファイルの中のバイトは書き換えられていないので、正しい文字コードを指定して開き直せば、確実に元通りになります。
そのためMojiRescueでは、ファイルの文字コード変換を主な機能に置いています。
貼り付けたテキストからの復元は、直せる場合は直し、直せない場合はその理由と、元ファイルからの直し方をお伝えするという形にしました。
戻せないものを、それらしく埋めて返すことはしていません。
文章の一部が推測で置き換わったデータは、化けたままより厄介になり得るためです。
コピペしたテキストの文字化けを診断・復元
MojiRescueなら、化けたテキストを貼り付けるだけで原因を自動判定し、可能な限り元の日本語に復元します。