1404143347 phpのhtmlspecialcharsに関する質問です。


------
<?php
function h($var){
$html = htmlspecialchars($var,ENT_QUOTES,'UTF-8');
return $html;
}

$text = 'HTMLでは&は&amp;と記述しなければなりません。';
echo $text;
$html = h($text);
echo $html;
?>
------
というphpファイルを作成して実行すると以下のようになります。
------
HTML縺ァ縺ッ&縺ッ&縺ィ險倩ソー縺励↑縺代l縺ー縺ェ繧翫∪縺帙s縲�TML縺ァ縺ッ&縺ッ&amp;縺ィ險倩ソー縺励↑縺代l縺ー縺ェ繧翫∪縺帙s縲
------
phpの書籍を読みながら勉強をしている身なのですが、なぜ文字化けを起こしているのかがわかりません。
(MAMPを利用していて、書籍のはじめに記載されていたphp.iniの編集は多分できているかと思います。たぶんというのは、「MANP/conf/」の階層に多くのphpのバージョンがあり、一番新しいバージョンのphp.iniしか編集していないため、正しいのかわからない…)

すみませんが、だれか回答宜しくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/07/08 00:50:03

回答2件)

id:watercooler No.1

回答回数289ベストアンサー獲得回数51

ブラウザが文字エンコーディングをシフトJISと思いこんでるのね。
php.iniでmbstring.http_output = UTF-8にすればいいはずよ。

一番最初にヘッダー出力してもいいわ。でも面倒よね。

header('Content-Type: text/html; charset=UTF-8');
他1件のコメントを見る
id:sugurukun11

webブラウザで何度もリロードしていたのですが、まさかサーバーにもキャッシュがあるとは知らなかったです。
今後、php.iniを触った際はサーバーの再起動を心がけるようにします。
親切に教えて下さりありがとうございました^ ^

2014/07/03 00:29:11
id:watercooler

サーバーのキャッシュ

コードキャッシュで調べてみるといいわ。

php.iniを触るのは極力避けたほうがいい

たしかに頻繁に触るようなものじゃないわ。でも言語設定のような最低限の設定は必要よ。よく使うレンタルサーバーの環境に合わせるくらいはしたほうがいいわね。

header()や環境設定で触っていこう

まちがっちゃいないわ。でも正解でもないの。
phpで何をやりたいのかわからないけどphpをしっかり学ぶならphp.iniの設定みたいなものは必須になるわ。初心者向けの本でも必ず書いてあるのはそのためよ。
.htaccess、header、ini_setみたいなのは高度な微調整用と思ったほうがいいわ。最初からこんなのに頼り過ぎるとプログラムも煩雑になって面倒になるの。phpを学びたいなら最初はできるかぎり簡単に書けるようにしたほうがやりやすいのよ。
最初から本格的なシステムを組みたいならWordPressみたいなCMSかCakePHPみたいなフレームワークを使ったほうがいいわ。そうすれば環境設定は一か所で済むから便利よ。セキュリティもある程度考えられているわ。システム構築に集中できるわよ。

目的と手段が逆転しないように考えながらがんばって。

2014/07/03 02:48:54
id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ブラウザが文字エンコードを誤解釈しているのは先の方の仰る通りでしょう。
ですが、誤解釈が原因なら http_outpput でどうこうなるモノでは無いと思います。
__http_output を設定しても、その誤解釈を修正してくれる訳では無いので

ブラウザは、ブラウザの表示設定>HTTPヘッダでの指定>HTMLソースの指定>ブラウザの自力の判断 の順で表示用のエンコードを決定しているハズです。
__HTTPヘッダの指定を無視するヤツもあるようですが

ご提示の部分の他でエンコードの指定(meta タグでの指定)がなされていれば、多分文字化けしないと思います。

PHPスクリプトで出力する場合、header() でエンコードをキチンと出しておく事は必須だとお考えください。これを面倒がって省略したりデフォルト設定をしたりすると別なトラブルの元となる事が多かったです。


MAMP の設定がどうであるかは知りませんが、PHP のデフォルトでは mbstring.http_output を目的のエンコードにするだけでは勝手に変換をしてくれないと思います。
mbstring.http_output = UTF-8
output_buffering = On
output_handler = mb_output_handler
が必要ではないかと。

本家マニュアルをご一読ください。
http://jp2.php.net/manual/ja/mbstring.http.php
__「実行時設定」には書かれていなくて別ページになっているので
__見落としやすい構成になっているのはどうかと思うけど...


文字化けに関しては
http://hain.jp/index.php/tech-j/2007/02/13/p125
のページが大変参考になりました。

他1件のコメントを見る
id:tezcello

間違って消してしまったので再度書きます。

> php.iniを編集したのち反映されるまでに少し時間がかかるもの
そんな事はありません。
でも、php.ini を変更しただけでは内容は反映されません。ウェブサーバ(Apache)の再起動が必要です。
.htaccess が使える状況なら、そちらに書いておけば再起動は不要です。

個人的には、php.ini を書き換えて何かをしておくというのは避けています。
いつも php.ini を編集できる環境だけで使うとは限らないからです。
何でも自由になるローカルで開発しても、実運用環境へ持っていく際に何らかの修正が必要となるとバグの温床になり得るからです。

出来る限り php.ini は変更せず、プログラム中で必要な設定を(各種設定系の関数や ini_set() で)するようにして、プログラムで変更できないモノだけ .htaccess で設定します。
__.htaccess を使う時はプログラム的に回避できないかをまず考えます

という考えなので、僕自身は http_output=pass にしてます。
つまり、全ての PHPスクリプトの先頭で header() や環境設定のあれこれを書いてます。


どの php.ini に書いたら良いのか判らないとありましたが、phpinfo() を実行すれば使っている php.ini が判ります。
(.htaccessを含む)プログラム中で環境設定するならば、気にする櫃世は無いですが。

2014/07/03 09:03:39
id:tezcello

考え方はそれぞれなので無理強いをする気は無いですが、何をどのように設定しているかを裏でやるのではなく、目で見える所に書いておくのが良いと考えています。
それで、先の補足のように PHPスクリプトの先頭(あるいはそこでインクルードするファイル)で、自分の欲している環境に整えるようにしています。
(設置先のデフォルト設定がどうなっているかは極力考えなくても良いですから)

今回の文字化けの一番の原因は、header() でどんなエンコードで出力するのかを明示しなかった事だろうと思います。
ブラウザで見る事を前提としているなら、それに合った手続きとしてやるべき事はキチンとやると。

極端かもしれませんが、初学者だから、HTTPヘッダなんて出さなくていいとか、表示時のエスケープは考えないとか、セキュリティは後から考えるとか...ではなく、最初からやるべき事はチャンとやるという習慣は必要だと思います。


PHPを学ぶという事は、大方の場合 PHP でブラウザへ表示する事が前提ですから、HTTPの仕組み、ブラウザの挙動、HTML,CSS の文法や仕組、etc...と学ぶべき事が広範囲です。
ファイルの読み書きや、メール、データベースを扱おうとしたら更に多くの知識が必要です。
アレコレ並べられると気が重くなってしまうでしょうが、出来るなら後回しでなく何かある度ごとに調べていかれると良いと思います。

入門用の書籍のサンプルで省かれる事が多いのは(どこかで著作者本人さんも書いていたけど)スペース的な都合とか見栄え的なものとからしいからなぁ...

2014/07/03 09:44:25
id:sugurukun11

こちらの補足で、井戸端さんとtezcelloさんへのお礼のコメントを記載させていただきます。

お二人のアドバイスをもとに試行錯誤した結果、無事に文字化けの問題を解決することが出来ました!

本当に有難うございます!

しかし、何が原因で何がきっかけとなって解決できたのかいまいち理解できていない状態です。

というのも、お二人のアドバイスをもとにソースコードをいじったり、tezcelloさんが記載してくださった参考サイトを見てphp.iniをいじってみたりしても文字化けを解決できずにいたのですが、何がきっかけとなったのか突然、文字化けが解消されてしまったからです。

なにがきっかけとなったのか調べるために、ソースコードに付け加えたコードを全部消しても文字化けが解決されているので、きっとphp.iniを触ったから解決できたのだろうと自分の中で納得しようとしているのですが、なぜphp.iniを触った直後に解決できなかったんだろうと疑問が残ります。

もしかして、php.iniを編集したのち反映されるまでに少し時間がかかるものなのでしょうか?

お忙しいと存じますが、この質問に回答していただけたら幸いです。

失礼致します。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません