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

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

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

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

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

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

#

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

![文字化けした画面](https://i.stack.imgur.com/PSres.jpg)

![画像の説明をここに入力](https://i.stack.imgur.com/KcZdF.jpg)
CC BY-SA 3.0
2015-02-28T14:24:35.643
7254
2015-03-02T01:56:58.297
2015-03-01T12:03:52.187
7634
7634
question
php windows firefox
PHPのvar_dumpを使うと文字化けを起こします。
ブラウザの文字エンコードが自動認識になっていて、出力のエンコード指定ヘッダより前にデータがあるからです。ブラウザの「表示」メニューあたりで日本語の自動認識を
UTF-8 などと指定すると直ると思います。
CC BY-SA 3.0
2015-02-28T16:42:38.533
7255
2015-02-28T16:42:38.533
5299
7254
answer
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` でもいいと思います。)

以上、いかがでしょうか。  
もし他に何か情報がありましたら、更に追記する形でお知らせください。
CC BY-SA 3.0
2015-02-28T16:52:05.533
7256
2015-03-02T01:56:58.297
2015-03-02T01:56:58.297
7926
7926
7254
answer