• ベストアンサー

文字化けを元に戻せますか?

鋼のéŒ¬é‡‘è¡“å¸ という文字化けがあるのですが、これをみて、いったい、どうして、こんな文字化けになっているのかを推測できますか? また、Perlを使って正しい文章に変換できますか? ちなみに、秀丸を使って様々な文字コードを試したのですが無理でした。なお、英文は一切影響を受けていませんでした。 なお、#123となっている部分は実際には、半角で、■や□、1/4などの文字です。 ちなみに、答えは、「鋼の錬金術師」です。 こんな、文字化けをみるのは初めてです・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

これは utf8 のフォームから送信された「鋼の錬金術師」のクエリを受信側で Latin-1 として解釈し、対応するコードのないもの及び一部の記号(ここでは「1/4」)を文字参照に変換したものだと思います。 ※Latin-1のコード表は参考URL参照のこと なお、ここの掲示板の仕組みにより、問題の文字列の一部が実際とは異なる文字に変換されてしまっていて(¬は実際には半角)、また本来は末尾にあったはずの《を半角にしたような文字もなくなってしまっていますが、これらは以下のようなコードで元の文字列に戻せます。 use Encode 'from_to'; my $str = "鋼の錬金術師"; # 文字参照を元のコードに戻す $str =~ s/&#(\d+);/ chr($1) /eg; # データ自体はutf8なので、それをShift_JISに変換 from_to($str, 'utf8' => 'shiftjis'); print $str, "\n"; ※正しく記載できない¬及び《の半角文字は、仕方がないので文字参照にしてあります。 ※秀丸で文字コードを「欧文」にして保存し、実行してください。

参考URL:
http://hp.vector.co.jp/authors/VA014833/HTML32/latin1.html
mai_540903
質問者

お礼

回答いただきありがとうございました。 ものすごく、参考になりました!!!

その他の回答 (1)

回答No.1

UTF-8の文字を何か別の文字エンコードで無理やり表示処理させたような感じを受けます。 いろいろなデータが勝手に補完されているので、この状態から復元するのは不可能かもしれません。 たとえば先頭の"醇"の文字コードはUTF-8で E9 86 87 ですが、この1バイト目の"E9"と、その後の 139(16進数で8B) 188(16進数でBC) をつなげて、"E9 8B BC"とすると、UTF-8で"鋼"という文字、となる事はなるのですが、この方法で全部は変換できそうにありません。 表示前の「元の文字」を取得できれば、正しくUTF-8に変換させることで表示できるようになると思いますが。

関連するQ&A