PHPのvar_dumpを使うと文字化けを起こします。

投稿者: Anonymous

先日PHPでよいデバッグ方法はないか、ここのサイトで質問してみました。
そしてvar_dumpという関数を使う方法を教えていただいたので、早速使ってみました。

そしたら添付画像のように文字化けを起こします。

ブラウザはFireFoxを使っていて、開発中のサイトを右クリック→「ページのソースを表示」でvar_dumpの結果を表示させています。

なぜこのように文字化けを起こしてしまうのでしょうか?
また、文字化けを起こさないよう何か良い方法がありましたら教えてください。

よろしくお願い致します。

【開発環境】
 ・Windows7pro
 ・PHP
 ・HTML
 ・ブラウザ:FireFox
 ・エディタ:NoEditor ※PHPとHTMLを編集用として使用

 

【続報】
 FireFoxのメニューにある「文字エンコーディング」という箇所で
 「日本語(EUC-JP)」を選択したらvar_dumpの結果が正しく表示
 されるようになりました。
 でも、別の問題が発生しました。
 今回、追加で添付した画像のように、今度は現在制作中のHPの方が
 文字化けを起こすようになってしまいました。
 そもそも、これは仕方のないことなのでしょうか?
 それとも何か改善方法はありますでしょうか?
 ※PHPファイルはUTF8Nの形式で保存しております。

 

文字化けした画面

画像の説明をここに入力

解決

asesino さんの回答をもう少し付け加えます。

HTML のエンコード指定はこういったものです。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

これが存在しないのに文字化けしてしまう場合は、HTML (ないしは .php ファイル) の文字エンコードとブラウザの標準文字コードが合致していない場合に起こります。

従って、表示させているファイル自身の文字コードを変えてみるといいと思います。
通例でよく利用されるのは UTF-8 という文字コードです。(少し古いものだったら EUC-JP など、ガラケー用の webサイトになるとキャリアにもよりますが Shift-JIS などもあります)


補足

これは推測でしかないのですが、Web_beginner さんがわざわざ

ブラウザはFireFoxを使っていて、開発中のサイトを右クリック→「ページのソースを表示」でvar_dumpの結果を表示させています。

上記のようなことをしているのは、var_dump() の表示結果が崩れてしまっているからではないでしょうか?

これ、防ぐ手が幾つかあるんですが

echo '<pre>';
var_dump($data);
echo'</pre>';

とします。(改行すら面倒くさい場合はそういう関数を作ってしまうのもお勧めです)

すると、ちゃんと var_dump() が改行付きの整形済みテキストで表示されますので、もし 「var_dump() を綺麗に表示させたいな」とお考えの時は上記を試してみてください。


追記:補足していただいた内容に対する回答

※見にくくて申し訳ありません。別回答として分けたほうがよさそうであればそうさせて頂きますので遠慮なく仰ってください。

恐らく、PHP の環境設定ファイル内で内部エンコーディングが EUC-JP で設定されているのだと思います。
問題点としては、var_dump() では EUC-JP 正しく表示され、Webサイト自体は UTF-8 で正しく表示されるようになっている、ということですね。

対処法 1. PHP の設定ファイルを変更する

これは以下のファイルを編集することで解決しますが、触れない環境であれば他の対処法を試してみてください。

  1. 変更するファイル:/etc/php.ini
  2. 変更する箇所:[mbstring]

    mbstring.language=Japanese
    mbstring.internal_encoding=”UTF-8″
    mbstring.http_output=”UTF-8″

上記を設定し終えたら、Apache を再起動ないしは設定ファイルのリロードをしてください。

対処法 2. meta タグで文字コードを指定する

最初に述べたとおり

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

上記 meta タグを タグと タグの間に挿入することによって「この web ページは UTF-8 で表示するつもりだよ」ということをブラウザに教えてあげることができます。

その他の meta タグについてはこちらを参照してください。
http://www.htmq.com/html5/meta.shtml

ただ、var_dump() 自体が EUC-JP で表示されている場合、meta タグだと効果が無いかもしれません…。(今手元に試せる環境が無いので確認ができません)

対処法 3. var_dump() の出力を文字エンコーディングして出力させるようにする

もういっそ var_dump() を使わず、自前で var_dump() のような関数を用意する方法です。
これは mb_convert_encoding() によって var_dump() で出力される文字コードを自前で変換します。

例えば、以下のような関数を自前で作ってしまいます。

/**
 * var_dump 文字化け回避用.
 * @param mixed $variable 表示したいデータ
 * @return string var_dump() 文字列
 */
function vd( $variable )
{
    $dump_object = '';
    ob_start();
    {
        var_dump( $variable );
        $dump_object = ob_get_contents();
    }
    ob_end_clean();
    return mb_convert_encoding('<pre>'.$dump_object.'</pre>', 'UTF-8');
}

使い方は、以下のように使います。

echo vd( array('ほげ','もげ','ぴよ','foo','baz','bar') );

var_dump() は使ったその場で出力されましたが、この関数は var_dump() で出力される内容をそのまま出力せずに、文字列として返します。
その為、関数の前に echo が必要になります。(もちろん vd 関数内で return せず、そのまま echo でもいいと思います。)

以上、いかがでしょうか。
もし他に何か情報がありましたら、更に追記する形でお知らせください。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *