文字化けの修復って、出来るのでしょうか?
ケースによって、「修復出来る場合」と「出来ない場合」があるのでしょうか?
◆環境「PHP」✕「MySQL」
◇前回
・「ブラウザ表示」はOK。DB内のみ文字化け(あるいは逆だったかも=「ブラウザ表示」のみ文字化けでDBはOK)
・latin1指定でデータdumpして、utf8変換後DBへ戻したら、文字化け解消した
◇今回
・「ブラウザ表示」「DB」、どちらも文字化け
・前回と全く同じ手順でやろうとしたところ、dumpしたデータが「???」のまま
■質問
・DB保存したデータが文字化けした場合、そのデータは二度と修正出来ない、ことはあり得るのでしょうか?
・あるいは、DBで、「???」となっているデータでも、詳しい人がやれば、必ず復旧できるものなのでしょうか?
また、こういうのはどういう仕組みになっているのでしょうか?
▽文字化けして読めない文書を解読できる「もじばけらった」 - GIGAZINE
http://gigazine.net/news/20120225-mojibakeratta/
>・DB保存したデータが文字化けした場合、そのデータは二度と修正出来ない、ことはあり得るのでしょうか?
「今回」のケースのように、おそらくDB保存する前にすでに文字化けている場合は、
修正できないことがあり得ると思います。
「前回」のケースのように、データの保存文字コードとDBの文字コードがあっていないだけであれば
単に表示の際に文字化けているだけなので、データ自体は破損していないため復旧できます。
>・あるいは、DBで、「???」となっているデータでも、詳しい人がやれば、必ず復旧できるものなのでしょうか?
誤った文字コード変換をかける過程で、データ自体が壊れてしまう可能性があるので、
必ず復旧できるとは言えないと思います。
例えば、「㍑」などのUTF-8にしかない文字を他の文字コードに変換すると、
元のデータは失われてしまいますので、文字コード変換は可逆ではありません。
>また、こういうのはどういう仕組みになっているのでしょうか?
これは単に元の文字列に対して、
mb_convert_encoding($str, "UTF-8", ***)
の組み合わせを色々やっているのではないでしょうか。
もしデータ復旧を試される場合、以下のような手順がよいと思います。
うまくいった場合、所々文字が壊れているかもしれませんが、読める状態まで戻せると思います。
1.
例えばDBの文字コードがlatin1の場合、
mysqldump --default-character-set=latin1
で保存データをダンプします。
2.
nkfなどのツールで、ダンプしたデータに対して、
PHP側で誤変換が起こった逆の変換をかけます。
例えばShift_JISの入力データを、PHPがUTF-8と誤認識してしまい、
mb_convert_encoding()で「UTF-8」->「EUC_JP」の変換をかけていた場合、
nkfで「EUC_JP」->「UTF-8」の変換をかければ、
Shift_JISの元データを(ある程度)復旧できるはずです。
なお、実感としては、元データに対して誤変換が2回以上かかっている場合、
残念ながらうまくいかないことのほうが多いように思います。