文字化けの修復について


文字化けの修復って、出来るのでしょうか?

ケースによって、「修復出来る場合」と「出来ない場合」があるのでしょうか?

◆環境「PHP」✕「MySQL」
◇前回
・「ブラウザ表示」はOK。DB内のみ文字化け(あるいは逆だったかも=「ブラウザ表示」のみ文字化けでDBはOK)
・latin1指定でデータdumpして、utf8変換後DBへ戻したら、文字化け解消した

◇今回
・「ブラウザ表示」「DB」、どちらも文字化け
・前回と全く同じ手順でやろうとしたところ、dumpしたデータが「???」のまま

■質問
・DB保存したデータが文字化けした場合、そのデータは二度と修正出来ない、ことはあり得るのでしょうか?
・あるいは、DBで、「???」となっているデータでも、詳しい人がやれば、必ず復旧できるものなのでしょうか?

また、こういうのはどういう仕組みになっているのでしょうか?
▽文字化けして読めない文書を解読できる「もじばけらった」 - GIGAZINE
  http://gigazine.net/news/20120225-mojibakeratta/

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2012/06/18 20:34:15

ベストアンサー

id:gyoh_k No.1

回答回数12ベストアンサー獲得回数6

>・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回以上かかっている場合、
残念ながらうまくいかないことのほうが多いように思います。

id:railway0

回答ありがとうございました

>「今回」のケースのように、おそらくDB保存する前にすでに文字化けている場合は、
>修正できないことがあり得ると思います。
>「前回」のケースのように、データの保存文字コードとDBの文字コードがあっていないだけであれば
>単に表示の際に文字化けているだけなので、データ自体は破損していないため復旧できます。
「DB保存の際の文字化け」と、「表示の際の文字化け」では、
同じ文字化けでも、意味が違うことが、よく分かりました。

>元のデータは失われてしまいますので、文字コード変換は可逆ではありません。
なるほど。やっぱりそうなんですね。

>nkfなどのツールで、ダンプしたデータに対して、
>PHP側で誤変換が起こった逆の変換をかけます。
逆の変換をかけるという発想はありませんでした。
参考にさせていただきます。

>Shift_JISの元データを(ある程度)復旧できるはずです。
>なお、実感としては、元データに対して誤変換が2回以上かかっている場合、
>残念ながらうまくいかないことのほうが多いように思います。
情報ありがとうございます。

大変参考になりましたー

2012/06/18 20:35:16

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません