結局、Mac OSXのターミナルでsqlite3を使い、read コマンドで直接データベースファイル内を見る事が出来、問題は自己解決しました。
文字化け例<p>èª æ›¸è¨˜éŒ²</p><p>1/15/09</p><p>åº</p><p>幸ç¦ã®çµŒæ¸ˆå ¦1050万/å¹´åŽã¾ã§ã¯å¹¸ç¦åº¦ã‚ãŒã‚‹ã€‚</p>
質問ですが、文字化けした文字を別のソフトで読むときに、さらに別の文字コードと認識して
2重の文字化けをした可能性を考えています。この場合、文字化けを治す方法はあるのかどうか?ということです。
恐らく、上の文字化けは、そういうたぐいのものではないかと考えています。
今後のために、この手の文字化けの対策法などアドバイスを頂ければと思います。
文字コードについて、少し勘違いされているような気がします。
「文字化けした文字」というものは存在しません。
「実際の文字データと違う文字コードとして表示した場合に文字化けが発生する」だけです。
例えばですが、A, B, Cという文字コードがあったとします。
Aという文字コードでは、「あ」という文字に対して、"0x00 0x00"という2バイトで表現するとします。「い」という文字に対して、"0x00 0xFF"という4バイトで表現するとします。
Bという文字コードでは、「A」という文字に対して、"0x00"という1バイトで表現するとします。また、表示可能な文字として、"0xFF"というデータが存在しないとします。
このとき、Aという文字コードで「ああ」という文字列があったとすると、データとしては、
"0x00 0x00 0x00 0x00"
という4バイトのデータになります。
このデータを、あるソフトで開いた際に、Bの文字コードとソフトが判定してしまったとしたら、「AAAA」というデータだと判定され、そのように表示され、文字化けが発生します。
表面だけを見ると、「ああ」というデータから「AAAA」というデータに変わったように見えますが、内部的には、同じ"0x00 0x00 0x00 0x00"です。
なので、このデータを別なソフトで開いたとしても、このデータをそのソフトがどう判断するかというだけになります。
で、ご質問の2重の文字化けを想定するのであれば、次のような状況です。
Aの文字コードで、「あい」というデータがあれば、それは、"0x00 0x00 0x00 0x00 0xFF"というデータになります。
このデータを同様に、あるソフトがBという文字コードだとして、読み込んだとすると、先頭3バイトは、「AAA」として解釈できますが、最後の1バイトが解釈できません。そこで、このソフトは例えば、そのデータを無視するソフトだとすれば、「あい」が「AAA」という文字列と解釈されてしまいます。
このソフトがこの「AAA」すなわち、"0x00 0x00 0x00"を保存する、あるいは、別のソフトに渡すということをすると、そのソフトにとっては、"0x00 0x00 0x00"というデータにしか見えませんので、仮に、Aという文字コードと判定してくれたとしても、「あ?」という形で文字化けが発生します。
とはいっても、通常のプログラムでは、解釈できない0xFFを無視するということはしないで、「表示できない文字を表示する」というようなことをします。ただ、これはそれを見ているユーザには見えません。そのため、見えたデータを使って何かしようとすると、ここでデータの欠落が発生します。
ですので、
プログラムの標準出力 ⇒ ターミナル ⇒ ターミナルからコピペしたデータ
Webからのデータ ⇒ ブラウザの表示 ⇒ 表示文字をコピペしたデータ
という場合にはこのようなことが発生します。
この場合、最終的なデータには、元データを復元するための情報を含んでいませんので、原理的に復元できません。
ただ、これがプログラムの内部的なデータの受け渡しであれば、表示可能なデータかどうかは一切関係ないので、上記の例でも、最終的な部分に、「0x00 0x00 0x00 0xFF」というデータがきます。その場合であれば、適切に文字コードを判定することができれば、正しくデータを読み出すことも可能です。
ただ、プログラムによっては解釈できない文字を、まとめて、別なデータにするという場合もあります。
上記の場合、"0xFF"が解釈できないので、"0xEE"というデータとして扱うということをした場合には、"0xFE"も解釈できないとすれば、同じく、"0xEE"と変換されてしまいますので、"0x00 0x00 0x00 0xEE"が、"0x00 0x00 0x00 0xFE"なのか、"0x00 0x00 0x00 0xFF"なのか区別がつきません。
こうなると、やはり復旧はできません。
まとめますと、ご質問の答えとしましては、「状況による」としか言えないです。
データの移動する経路によって、そのデータに変化が加えられなければ、いくらでも復元ができるというか、そもそもデータは化けていないので、最後に表示する部分だけの問題です。また、可逆な変換しかされない場合も同様に元データを作成することは可能でしょう。
しかし、それ以外のケースの場合は、最終的なデータに、元データと同じデータを含んでいないため、復元できません。
ちょっとややこしい話かもしれませんが、何かの参考になれば。
お礼が遅くなりました。非常に詳細にありがとうございます。ここに貼付けた文字化けから解読できない理由が理解できました。コピペが一つの鍵ですね。勉強になりました。