【文字化け対策上級?】前回、Sqliteファイル内の文字化けの直し方を教えて下さいとして質問をしましたが、回答がつかずキャンセルになりました。

結局、Mac OSXのターミナルでsqlite3を使い、read コマンドで直接データベースファイル内を見る事が出来、問題は自己解決しました。
文字化け例<p>èª æ›¸è¨˜éŒ²</p><p>1/15/09</p><p>序</p><p>å¹¸ç¦ã®çµŒæ¸ˆå ¦1050万/年収までは幸福度あがる。</p>


質問ですが、文字化けした文字を別のソフトで読むときに、さらに別の文字コードと認識して
2重の文字化けをした可能性を考えています。この場合、文字化けを治す方法はあるのかどうか?ということです。
恐らく、上の文字化けは、そういうたぐいのものではないかと考えています。
今後のために、この手の文字化けの対策法などアドバイスを頂ければと思います。

回答の条件
  • 1人5回まで
  • 登録:2009/06/06 01:55:39
  • 終了:2009/06/12 19:35:42

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752009/06/06 05:39:25

ポイント100pt

文字コードについて、少し勘違いされているような気がします。

「文字化けした文字」というものは存在しません。

「実際の文字データと違う文字コードとして表示した場合に文字化けが発生する」だけです。

例えばですが、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"なのか区別がつきません。

こうなると、やはり復旧はできません。


まとめますと、ご質問の答えとしましては、「状況による」としか言えないです。

データの移動する経路によって、そのデータに変化が加えられなければ、いくらでも復元ができるというか、そもそもデータは化けていないので、最後に表示する部分だけの問題です。また、可逆な変換しかされない場合も同様に元データを作成することは可能でしょう。

しかし、それ以外のケースの場合は、最終的なデータに、元データと同じデータを含んでいないため、復元できません。


ちょっとややこしい話かもしれませんが、何かの参考になれば。

id:nobnob3

お礼が遅くなりました。非常に詳細にありがとうございます。ここに貼付けた文字化けから解読できない理由が理解できました。コピペが一つの鍵ですね。勉強になりました。

2009/06/12 19:35:31

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません