• 締切済み

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のエンコードで保存しています。

  • PHP
  • 回答数5
  • ありがとう数2

みんなの回答

  • 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

  • 文字化けについて

    <?php //文字化け $a = "あいうえお"; ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF8"> <title><?php echo $a;?></title> </head> </html> ========================================================== 宣言以前のマルチバイトに対する対策はどのようにしたら良いでしょうか?

    • 締切済み
    • PHP
  • HTML・PHPの文字化け

    こんにちは。 PHPとMySQLを使ってショッピングカートを作ろうと思ったのですが、しょっぱなから躓いてしまいました・・・。 index.htmlでメタを <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> とeuc-jpにしたのですが、サーバーにアップすると文字化けしてしまいます。 表示のエンコードで確認するとシフトーJisになっています。eucにするとちゃんと表示されるのですが、更新するとやはり文字化けします。PHP・MySQLがeucですので、困っています。 どうにか対処方法はないでしょうか?ご教授をよろしくお願いします。

    • ベストアンサー
    • HTML
  • PHPをhtmlに読み込んだファイルが文字化けする

    お世話になります。 通常のHTMLファイルにWordPressを生成し、WPでブログを書いたファイル(/wp/index.php)を読み込んで、表示させたいと考えております。その件に関してはなんとか表示できるようになったのですが、私が作ったhtmlファイル(/wp/index.html)はShift-JISで、 WordPressが吐き出してるブログ(/wp/index.php)はUTF-8で文字コードが違うので、ブログ部分のみ文字化けが起こります。それで上記のように/wp/index.htmlのcharsetをShift-JISからUTF-8へ変更しました。 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ところが「テキストコーディングエラー」とポップアップが起こりました。「設定したテキストエンコーディングで保存済みですが、テキスト中のcharset設定と一致していないので、ブラウザ等で表示すると文字化けする可能性があります」とのことです。その結果、今度はブログ部分がちゃんと表示され、HTMLで作成した部分は文字化けするようになりました。これはPHPの問題ではないかもしれませんが、原因がどうにも分かりません。もしかしたら初歩的な質問をしているかもしれませんが、よければ教えていただけないでしょうか。

    • ベストアンサー
    • PHP
  • 文字化け Win & Apache & ActivePerl

    ウインドウズでApache & ActivePerlの組み合わせで index.htmlを作成して表示させたところ日本語が文字化けしてしまいました。ソースは以下です。何か設定が不足しているのでしょうか?(Apache側とかに) <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>テスト</title> </head> <body bgcolor="#FFFFFF"> <p>テスト<br> ・・・・・

    • ベストアンサー
    • HTML
  • 文字化けが直りません。

    どうしてもUTF-8を指定すると文字化けしてしまいます。ご指導お願いします。 検索して調べたのですがわかりませんでした。 ブラウザーの設定等も必要なのでしょうか? ちなみにshift_jisにすれば文字化けしません。 以下ヘッダー部分です。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>TOPページ</title> </head> 以上、よろしくお願いします。

    • ベストアンサー
    • HTML
  • なぜ文字化けしないのでしょうか?

    Windows Me(shift_jis)とFedoraCore4(utf-8)のPCのブラウザに以下のFedoraCoreのPCに配置してあるgomi.php(utf-8で記載)を表示させて 入力欄に「お元気ですか。」と日本語を入れてもその応答が文字化けしません FC4はutf-8なのでshift_jisのWindows Meでは文字化けするはずですがしませんがどうしてでしょうか? gomi.php -------------------------------------------------------- <?php $in=isset($_POST['in'])?$_POST['in']:'bad'; echo '<?xml version="1.0" encoding="utf-8"?>'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/> <title>test</title> </head><body> <p><?= $in ?></p> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> <input type="text" name="in"/> <input type="submit" value="送信"/> </form> </body></html>

    • ベストアンサー
    • PHP
  • PHPについて教えてください

    下記のindex.htmlとcheck.phpを別々にURLに入力すると正しく表示されるのですが 横の送信ボタンを押したときにcheck.phpにジャンプしてくれません どうしてでしょうか? index.html <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <from method="post" action="check.php"> <input name="nickname" type="text" style="width:100px"> <input type="submit" value="送信"> </from> </body> </html> check.php <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <?php print'ようこそ'; ?> </body> </html>

    • 締切済み
    • PHP
  • ファイヤーフォックスでの文字化け

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta name="keywords" content="" /> <meta name="description" content="" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <link rel="stylesheet" href="css/import.css" type="text/css" /> </head> </head>までの部分をコピーペーストしてみましたが、昨日、<body>~<body>部分で更新をしようと思い、予定情報の終了した分の文字を削除して、ローカルで確認したところ、そのページすべてが文字化けしていました。アップロードしても文字化けはなおりませんでした。 因みに文字コードはUTF-8に設定して(いるつもり?)作成しており、これまでIEもグーグルクロームもファイヤーフォックスもしばらく使ってそのようなことはありませんでしたので、何が原因なのかわかりません。(現在、ファイヤーフォックスです。) 詳しい方教えて下さい!!

    • ベストアンサー
    • HTML
  • 文字列の一部を取り出したいのですが、文字化けしてしまいます。

    文字列の一部を取り出したいのですが、文字化けしてしまいます。 コードは以下のとおりです。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <?php $str = "日本語日本語UTF-8"; print mb_substr($str, 0, 3); ?> </body> </html> おそらく2バイト文字の途中で切っているので文字化けするのだと思いますが、 対象方法が分かりません。 ご存知の方がいらっしゃいましたら、すみませんが教えてください。

    • ベストアンサー
    • PHP
  • PHP 文字化けの解決策。

    こんばんわ。PHP初心者です。 以下のコードは、http://table.yahoo.co.jp/tのソースをすべて読み取り、ブラウザ上で表示させるプログラムです。 ですが、ブラウザ(クロームを使用)で表示する際、なぜか文字化けしてしまいます。 どうすれば解決するでしょうか? ちなみにhttp://www.yahoo.co.jp/は文字化けせず、正常に表示させることができます。 PHP.iniをいじる必要がありますか? PHP.iniのことは一切分かりません。 よろしくお願いします。 <?php $result = ""; $lines = @file("http://table.yahoo.co.jp/t") or $result = "ファイルが読めません。"; if ($lines != null){ for($i = 0;$i < count($lines);$i++){ $result .= ($i + 1) . ": " . $lines[$i] . "<br>"; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>sample page</title> </head> <body> <h1>Hello PHP!</h1> <p><?php echo $result; ?></p> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう