• 締切済み

PHP でデータファイルを別にすると文字化け

PHPの初心者ですが、文字化けで困っています。 index.php には以下の内容を入れています。 <?php include("ja.php"); echo '<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <p>'.$WELCOME_TEXT.'</p> </body> </html>'; ?> ja.php には以下の内容を入れています。 <?php $WELCOME_TEXT = 'ようこそ'; ?> これでindex.phpを表示させても「????」と出るだけなのですが、どうすれば文字化けがなくなるのでしょう?どちらのファイルもUTF-8のエンコードで保存しています。

みんなの回答

  • march4
  • ベストアンサー率50% (12/24)
回答No.5

補足です。 http://oshiete1.goo.ne.jp/qa1288725.html?from=navi_ranking 上記URLの質疑応答が、ほぼ、こちらの質問内容と同じなので、 参考にされると良いですね。 問題の核心部分は、 上記URLの回答NO.2に書かれていると思いますので要チェックです。 それを参考に、 mb_detect_order()にて、 文字コードの検出順を変更されてみてはいかがでしょう? (php.iniでの現在のmbstring.detect_orderの設定は、「auto」でしょうかね。) 詳しい設定例は、以下参照で。 http://www.php.net/manual/ja/function.mb-detect-order.php UTF-8の優先順位をあげると、改善されるかもしれません。 以上で解決されると良いなと思います^^

  • march4
  • ベストアンサー率50% (12/24)
回答No.4

お話を聞く限り、ブラウザは問題なさそうですね。 >「mbstring.script_encoding no value no value」 が一つ多く入っていました。 この、「1つ多く入っていた」というのは、 phpinfo(); によって表示される一覧表に、 同じ項目(mbstring.script_encoding)が重複して表記されている、 ということでしょうか? (※「no value」が2度繰り返されているだけ、ではないですよね?) もしそうだとすると、不思議ですね。 php.iniファイルをもし直接開いて見ることができるのであれば、 そこには、「mbstring.script_encoding」に関する設定文が、 2重に書かれていることになるのでしょう。 私も詳しくないので正確なことは言えませんが、 「その2重は、バグの原因になってそうだなぁ」 と感じます。 ちなみに、私のサーバでは、 phpinfo(); では、 mbstring.script_encoding の項目が表示されません。 つまり、php.iniに、そもそも記載がないのかもしれません。 phpマニュアルの設定例でも、その項目の記述はありませんね。 (http://www.php.net/manual/ja/mbstring.configuration.php#ini.mbstring.internal-encoding) ※要するに、記述がなくても、問題なく動くのでしょう ※もっと言えば、記述があることで問題が生じてしまう、なんてこともあるのかもしれません。 もし、php.iniを直接開いて変更できるのであれば、 2つ書かれているうちの1つを、「;」にてコメント化し、 動作を確認してみると良いかもしれません。 (むしろ、「mbstring.script_encoding」の項目自体、コメント化しておいても良さそうですが…。※上記の理由から) ※php.iniの設定変更後は、PHPの使用環境によっては、 Apacheの再起動が必要になるかもしれませんので、 その場合には、再起動方法について、サーバの仕様で確認してみて下さい。 (もし可能であれば、あらかじめ、php.iniの記述に誤りはありませんか~?とお尋ねになると良いでしょう。) で、php.iniの設定変更が反映されたとして、その結果、 問題が改善されるようなら、設定はそのままにしておく、、と。 気になるようでしたら、レンタルサーバのサポートページでも、 質問されると良いかもしれません。 ブラウザの文字エンコーディングも、UTF-8であり、 ファイルの保存形式も、UTF-8であり、 metaタグの記述も、UTF-8であり、 文字化けしている文字列「????」もUTF-8にエンコードされていて、 さらに、サーバを換えると、正常に表示される、 ということですから、 間違いなく、サーバ側(php.ini)に原因があると思います。

hopeless80
質問者

補足

>「mbstring.script_encoding no value no value」 が一つ多く入っていました。 というのは、問題ないサーバーにはこのストリングはなく、問題のあるサーバーにこのストリングが入っていたという意味です。 補足でいただいたmb_detect_order()でもやはり問題は解決しませんでした。 $WELCOME_TEXT = 'ようこそ'; をindex.phpの中に含めてしまうと問題なく表示されるのですが、データ ファイルを別にした場合にのみこの問題が発生します。複数言語のサイトを作成しようと思っているので、文字列はすべて別ファイルにしたいんですが、根本的にやり方が間違っているのでしょうか。 ホスティング会社に質問してみると "It will still cause it to come out garbled in this method." と、全く解決しない返答があったので、もうあきらめようかと。 複数言語のサイトをMySQLなどのDBなしで作成する方法を探しているんですが。。。

  • march4
  • ベストアンサー率50% (12/24)
回答No.3

>「UTF-8です」と表示されました。 とのことですから、 ブラウザの表示の設定において、 「文字エンコーディング」→ UTF-8 としてやれば、「????」の箇所は正しく表示されると思います。 まず、この点をご確認下さい。 ちなみに、回答NO.1の方が、それを指摘されていましたね。 ブラウザ(インターネットエクスプローラーとか、Firefox等のことです。)の文字エンコーディングの設定が、すでに、UTF-8であるにも関わらず、「????」ということでしたら、 正直、謎です。その場合には、後述する作業をしてみて下さい。 で、もし、ブラウザの表示設定がUTF-8になっていない場合には、 そのスクリプトファイルがUTF-8で保存されていない可能性が高いので、再度その点をご確認下さい。 (あー、でも、他サーバでは正しく表示されるとのことなので、この可能性は低いですね。) では、最終手段となりますかね…。 スクリプトファイルに、 phpinfo(); を記述し、そのスクリプトファイルの表示結果を、 二つのサーバで比較してみて下さい。 特に、「mbstring」の項目の比較をして下さい。 マルチバイト(ここでは日本語)文字表示に関する設定です。 言ってみれば、そのサーバにおけるPHPのルールのようなものです。 これを、2サーバで比較し、異なる点があれば、そこがあやしい! ということになります。 その点を改めて、こちらに記載して頂ければ、 誰かが助けてくれると思います。^^ なお、「????」と表示されるのは、どのブラウザ使用時でしょうか? 試しに、他のブラウザでも確認してみることをお勧めします。 ブラウザの問題の可能性も、なきにしもあらず、なので。

hopeless80
質問者

補足

ブラウザでのエンコーディングがUTF-8になっていることは確認しましたし、IE8、Firefox 3、Chrome 2すべてで同じ結果です。 phpinfo(); で、「mbstring」の項目を確認するとほとんどが同じですが、「????」と表示されるほうには 「mbstring.script_encoding no value no value」 が一つ多く入っていました。 これは関係するのでしょうか。

  • march4
  • ベストアンサー率50% (12/24)
回答No.2

>index.phpを表示させても「????」と出る ということなので、おそらくは、 index.phpの内容の文字コードがUTF-8ではないのでしょうね。 つまり、 $WELCOME_TEXT = 'ようこそ'; の文字コードがUTF-8ではないために、 UTF-8で保存されている(と言われている)、includeしている側の ファイル上で正しく解釈できずに、文字化けとなっていることが 考えられます。 よって、以下のソースを、 include文の下に貼り付けてみて、その結果をウェブブラウザで確認して下さい。 このソースによって、 $WELCOME_TEXTの文字コードがUTF-8かどうか、確認できます。 (確認後は、以下のソースは消して下さいね。) if(mb_check_encoding($WELCOME_TEXT,'UTF-8')){ echo '$WELCOME_TEXTの文字コードはUTF-8です。'.'<br>'; } else{ echo '$WELCOME_TEXTの文字コードはUTF-8ではありません。'.'<br>'; } で、確認した結果、もし、UTF-8ではありません、となったら、 「$WELCOME_TEXT」をUTF-8へ、エンコードしてやりましょう。 エンコードしてやれば、「????」とはならないはずです。 そして、そのエンコードの方法は、 mb_convert_encoding($WELCOME_TEXT, "UTF-8", "auto" ); これだけです。 この一文を、include文の下に貼り付けて下さい。 この一文に関しては、消さずに置いておきましょう。 これがある間は、常にUTF-8にエンコードし続けてくれますから。 ---------------------------------------------- ちなみに、2つのファイル、どちらにおいても、 HTML(metaタグ)で文字コードを設定されているようですが、 header('content-type:text/html; charset=utf-8'); と、どちらのファイルでも、 PHP経由でエンコードする方法も試してみて下さい。 このheaderの一文は、一番上(先頭に)に書いて下さい。 この方法でも解決しそうです。(こちらの方がお勧めかも) HTMLのmetaタグによる方法と、 PHPのheaderによる方法で、若干、効き具合が違うような話を どこかで読んだ記憶があります。 もし、記憶違いでしたら、ごめんなさい。笑 以上、2つの方法を書かせて頂きました。 どちらでもOKと思われますが、後者をまずは試してみて下さい。

hopeless80
質問者

補足

丁寧にご回答ありがとうございます。両方試したのですが、改善されず、最初の文字コードがUTF-8かどうかの確認でも「UTF-8です」と表示されました。 何がおかしいのか分からず、他のサーバーに置いてみると問題なく表示されました。全く同じファイルなのですが、片方では「????」と、もう一つのサーバーでは「ようこそ」と表示されます。 サーバー側の問題でしょうか。サーバーの何を確認すればよいか、助言いただければ助かります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

まず、ブラウザの文字エンコードを手動でUTFにして文字化けが なおりますか? そうであればPHPでヘッダーを吐いてやればいいのでは?

関連するQ&A