- ベストアンサー
フォーム入力のエンコーディングについて
HP作成初心者で、PHP勉強中です。 素朴な疑問なのですが、クライアントさんがフォームに入力したデータがサーバに送られるときの文字エンコーディングは、入力HTMLやPHPのエンコーディングに自動的に会うようになっているのでしょうか? ちなみに、私は現在のところ全てEUC-JPで統一させているのですが、データがSJISで送られてきたら困るな、とふと思ったもので。 基本的なことかもしれませんが、よろしければお教えください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No1です。ひどく脅かしてしまわれたかもしれませんが、個人のサイトで使う分にはあまり気にする必要はないでしょう。 しかし送られてきたデータをチェックするのは、PHPの基本を学ぶ以前の問題になってきます(意識的に)。 質問のように疑問を持ったのはいい心がけかと思います。 さて、私が指摘した「METAタグ」による「EUC-JP」のも字コード指定は、おまじない程度に思っていてください。と書きましたが、この辺をもう少し詳しく。 まず、METAタグで指定していない場合は、ブラウザは何を基準に文字コードを決めているのでしょうか。 その答えの1つがMETAタグによる指定ですが、ではMETAタグでEUCとSJISを指定した場合はどうなるのでしょうか(これはブラウザに依存されます) では、次のパターンは・・・ <HTML> <HEAD> <!-- これはSJISで書いた文字 --> <TITLE>これはSJISで書いた文字</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> さらに、JSPで出力する場合も、METAタグの指定だけでEUCとして表示させようとすると文字化けします。 ここいら変に詳しく載っています。 http://sometime.minidns.net/~ccgi/judgecode.html http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/htheader.html http://www.tohoho-web.com/lng/199801/98011002.htm もし確実に、文字コードを「EUC」にさせたい場合は「METAタグ」で指定するより、以下の方法で。 header("Content-Type: text/html; charset=EUC-JP"); 当然の事ながら、上の処理は最初の「<HTML>」をはき出す前に出力してください。 で、完璧にブラウザにEUCで表示させることが出来たとして、それで文字コードの問題は解決するでしょうか。 たいていの場合ブラウザにインターネットエクスプローラーかモジラか、もしくはそこから派生したもの。でしょう。 しかし、JAVAやC言語(もちろんPERLでも)で自作簡易ブラウザを作成することもそう難しくはありません。 あるいは前書いたように、Telnetでサイトを見て回ることも出来ます。以下はその例です。 まず、コマンドプロンプトを立ち上げ、(hogehogehoge.co.jpは架空のドメインです) >telnet hogehogehoge.co.jp 80 GET /mybbs.php HTTP/1.0 User-Agent: aaaaaa[ja](bbbb) Host: cccc.co.jp これで、GETでデータを送信するのも出来そうですね。GETで送れるのだったら、POSTで送ることも出来ます(やり方は書きません)。 POSTで送れる方法がわかれば、あとはEUCやUTFの文字コード対応のエディタで「こんにちは」を書き、SJISやUTFといったEUC以外の文字コードで保存します。次に、今度はその保存したものをEUCで開いてやると・・・。 文字化けしたデータができあがります。 簡単ですね。(^ ^ ;ゞ あとは、Telnetで送信してあげれば、文字化けした「こんにちは」が送られます。 まぁ、これでも最初にいったように、自分自身のサイトでつくったPHPプログラムであれば、そんなデータを削除してしまえばいいだけのことですが、仕事で誰かにお金をもらってつくったとしたら・・・。 不特定多数の人が見に来る可能性があるプログラムの場合は、「レンタルサーバの設定次第」で違う動作になったり、「古いブラウザでアクセスしてこられると困る・・・」というようなプログラムの作成はなるべく避けてください。 プログラマーにとって一番大事なのは、あらゆる状況を想定してつくる。と、いうことです。(めんどくさいエラー処理もそのためです。確実に開けるとわかるファイルも、開けなかった場合を想定していますよね。この辺はJAVA言語なんかは逆におろそかにすると、コンパイルエラーが出ます。例外という概念がPHPより徹底しているので) 実は、IE(インターネットエクスプローラー)ってちょっと癖がある(他のブラウザももちろんそうですが)ので、たとえば125バイト(だっけ?)受け取らないと表示しないとか、色々プログラマーの予想外の動作をするので、どんなデータが送られてくるかは、永遠の問題でもあります。 PHPになれてきたら自分でSJISからEUCに文字コードを変換するプログラムを作ってみてください。文字コードの問題の深さがわかるでしょう。 できればC言語でやっちゃったりすると、PHPがいかに初心者向きなんだな~。なんて事もわかると思います(もちろんPHPの良さもわかりますよ)。 がんばってください。
その他の回答 (4)
- kotaron
- ベストアンサー率61% (8/13)
こんにちは、 議論に参加させてください。 まず、EUC-JPソースからのフォーム入力という事なので PC相手の場合には、99%は安心なのではないでしょうか? ><meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> と書かれてあるので携帯は対象外みたいですし、 私の知る限り、 HTMLソースのエンコーディングと違う、 エンコーディングデータでポストされてくるのは、 ブラウザは、Lynxだけです。 もっとも、この場合は、SJIS指定でもEUCとして返されるという話になりますので、 話の内容としては、問題ないかと思います。 一点だけ例外としては、SJISで書いていたHTMLフォームを途中でEUCにした場合に、 補助入力の機能を利用すると、SJISで来る場合がありますが、 phpの設定と、スクリプトでインターナルエンコーディングの設定を適切にしておけば、 ある程度は自動的に処理してくれます。 レンタルサーバーの場合、少し注意しないといけないんですけど・・・ いたずらなデータをポストしてくる輩もいますが、 その場合は、まともな文字データではありませんし、 違った観点の対処が必要になるかと思います。 ><meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> >をいれておけば大丈夫かと思いましたが、これもブラウザによってはできないこともあるでしょうか? この質問なんですが、 携帯以外で日本語に対応したブラウザでしたら 問題ないと思わないとしかたがないような気がします。 そんなブラウザがあるのでしたら、私も知りたいですね。 携帯でも、auとVodafoneの新型は結構賢いんですけど、DoCoMoはちょいと不安ですね。 思いつくまま、書かせてもらいました。
- campanella_77
- ベストアンサー率66% (35/53)
こんにちは。No.1で解答したものです。 $comment = stripslashes($comment); <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> を書いておけば、EUC-JPとブラウザが判断する確率が高くなりますよ。というおまじないぐらいに思っていてください。また、EUC-JPで表示させても、悪意がある人が文字コードをSJISやその他の文字コードに表示させる可能性や、誤判も十分あり得ますからね。 えっと、Telnetサーバが立ち上がってるか立ち上がってないかに限らず、Telnetを使えばたいていのサーバにアクセスできます。Telnetを使ってSMTPサーバに接続すれば、メールも送信できますし、POPサーバに接続すればメールも受信(というより表示)させることも出来ます。Webサーバに接続すれば、ページを表示(文字だけですが)させることも出来れば、フォームでデータを送信するようにTelnetで送信することも出来ます。 つまり、色々なデータが来ることを予測してつくらないとダメなんですね。ま、この辺に関してもPHPは標準で便利な関数をもっているので、たとえば最低でもTEXTAREAで送られてくるデータのチェックは、以下ぐらいのことはやっておいた方がいいかもしれません。 //●文字コードを変更 if (function_exists(mb_convert_encoding)) $comment = mb_convert_encoding($comment,"EUC-JP","auto"); //●タグを変更する $comment = str_replace ('<', "<", $comment); $comment = str_replace ('>', ">", $comment); //●改行\nを変換 $comment = str_replace("\r\n","\n",$comment); $comment = ereg_replace("\n{5,}", '<BR>', $comment); $comment = str_replace("\n\n", '<P>', $comment); $comment = str_replace("\n", '<BR>', $comment); //●「,」を全角に変更 $comment = str_replace (",", '、', $comment); //●「'」を全角に変更 $comment = str_replace ("'", ''', $comment); $comment = str_replace ('"', '"', $comment); //●不必要な「\」を消去 $comment = stripslashes($comment); たぶん、コピペで $comment を変更してもらえればどの環境でも使えると思います。 更に、データ次第でこれに付け足していく感じで進めていってください。
- happy_books
- ベストアンサー率28% (131/460)
私もPerlの頃から、日本語の問題もあり、EUC-JPを で統一してきました。 が、心配性なので、何があるかわからんので、コード の変換はしてきました。 PHPの場合は、 mb_convert_encoding だけなので、コード変換自体は簡単ですよ。 念のために、私はブラウザーで無理に違った コードにして(文字化けしている用にしてから)、 送信は試しています。 簡単な送信フォームで使用するスクリプトが 多いので、常連さんだと文字化けてても、配置を 覚えていて、送信する人もいるとは思うので。 ただし、サーバ側の設定で、日本語が優位に なっていないと、うまく変更できないそうです。 http://ns1.php.gr.jp/pipermail/php-users/2004-May/022334.html
- campanella_77
- ベストアンサー率66% (35/53)
基本的にはそうだと思いますが、あまり保証されないかもしれませんね。 色々なパターンで実験してみるとわかると思いますが、ブラウザ次第という感じでした。 また、見ている人もEUCで表示させてあるかは保証できませんし。(文字化けしたページがよくありますよね)、どちらにしろサーバ側(ここではPHP)で文字コードをチェックするか変換する処理は備えておいた方が無難です。 また、TELNETや自作のクライアントでデータを送ってくる場合もなきにしもあらず。 SJISやUTFで文字列を送る方法はいくらでも考えられます。あまり神経質になる必要はないとは思いますが、そうしたいたずらをされないという保証もありませんしね。 PHPではたいていの場合、標準で文字コードを変換する関数が使えると思うので(設定次第でうまく動作しないこともありますが・・・)、掲示板のように文字列を扱うようなプログラムを作成するにはそういったものを利用するとよいと思います。
お礼
ご回答有難うございます! できない場合もあるかもしれない、ということですね。 >見ている人もEUCで表示させてあるかは保証できませんし headに <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" /> をいれておけば大丈夫かと思いましたが、これもブラウザによってはできないこともあるでしょうか? >どちらにしろサーバ側(ここではPHP)で文字コードをチェックするか変換する処理は備えておいた方が無難です。 仰るとおりですね。チェックして必要なら変換するようにやってみようと思います。(できるかな・・) また、telnetやIPアドレスを登録されていないssh接続はできないサーバらしいので、その点は大丈夫だと思います。 常識的なことも知らないことが多く、なかなかプログラム作成に時間がかかってしまいますが、なんとか思うようにつくっていけるようがんばります。