アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

補足です。



http://oshiete1.goo.ne.jp/qa1288725.html?from=na …

上記URLの質疑応答が、ほぼ、こちらの質問内容と同じなので、
参考にされると良いですね。

問題の核心部分は、
上記URLの回答NO.2に書かれていると思いますので要チェックです。

それを参考に、
mb_detect_order()にて、
文字コードの検出順を変更されてみてはいかがでしょう?
(php.iniでの現在のmbstring.detect_orderの設定は、「auto」でしょうかね。)

詳しい設定例は、以下参照で。
http://www.php.net/manual/ja/function.mb-detect- …

UTF-8の優先順位をあげると、改善されるかもしれません。

以上で解決されると良いなと思います^^
    • good
    • 0

お話を聞く限り、ブラウザは問題なさそうですね。



>「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.configurat …
※要するに、記述がなくても、問題なく動くのでしょう
※もっと言えば、記述があることで問題が生じてしまう、なんてこともあるのかもしれません。

もし、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)に原因があると思います。

この回答への補足

>「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なしで作成する方法を探しているんですが。。。

補足日時:2009/08/28 01:02
    • good
    • 0

>「UTF-8です」と表示されました。



とのことですから、
ブラウザの表示の設定において、
「文字エンコーディング」→ UTF-8
としてやれば、「????」の箇所は正しく表示されると思います。
まず、この点をご確認下さい。
ちなみに、回答NO.1の方が、それを指摘されていましたね。

ブラウザ(インターネットエクスプローラーとか、Firefox等のことです。)の文字エンコーディングの設定が、すでに、UTF-8であるにも関わらず、「????」ということでしたら、
正直、謎です。その場合には、後述する作業をしてみて下さい。
で、もし、ブラウザの表示設定がUTF-8になっていない場合には、
そのスクリプトファイルがUTF-8で保存されていない可能性が高いので、再度その点をご確認下さい。
(あー、でも、他サーバでは正しく表示されるとのことなので、この可能性は低いですね。)

では、最終手段となりますかね…。
スクリプトファイルに、
phpinfo();
を記述し、そのスクリプトファイルの表示結果を、
二つのサーバで比較してみて下さい。
特に、「mbstring」の項目の比較をして下さい。
マルチバイト(ここでは日本語)文字表示に関する設定です。
言ってみれば、そのサーバにおけるPHPのルールのようなものです。

これを、2サーバで比較し、異なる点があれば、そこがあやしい!
ということになります。
その点を改めて、こちらに記載して頂ければ、
誰かが助けてくれると思います。^^

なお、「????」と表示されるのは、どのブラウザ使用時でしょうか?
試しに、他のブラウザでも確認してみることをお勧めします。
ブラウザの問題の可能性も、なきにしもあらず、なので。

この回答への補足

ブラウザでのエンコーディングがUTF-8になっていることは確認しましたし、IE8、Firefox 3、Chrome 2すべてで同じ結果です。

phpinfo(); で、「mbstring」の項目を確認するとほとんどが同じですが、「????」と表示されるほうには
「mbstring.script_encoding no value no value」
が一つ多く入っていました。
これは関係するのでしょうか。

補足日時:2009/08/27 07:00
    • good
    • 0

>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と思われますが、後者をまずは試してみて下さい。

この回答への補足

丁寧にご回答ありがとうございます。両方試したのですが、改善されず、最初の文字コードがUTF-8かどうかの確認でも「UTF-8です」と表示されました。

何がおかしいのか分からず、他のサーバーに置いてみると問題なく表示されました。全く同じファイルなのですが、片方では「????」と、もう一つのサーバーでは「ようこそ」と表示されます。

サーバー側の問題でしょうか。サーバーの何を確認すればよいか、助言いただければ助かります。

補足日時:2009/08/27 01:26
    • good
    • 0

まず、ブラウザの文字エンコードを手動でUTFにして文字化けが


なおりますか?
そうであればPHPでヘッダーを吐いてやればいいのでは?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!