UTF-8のPHPでのフォーム入力の文字化け問題について

このQ&Aのポイント
  • UTF-8のPHPで作成したフォームに日本語を入力してsubmitすると、正しく文字化けせずに表示されるようです。
  • 入力値をhtmlentitiesでエンコードした場合、日本語が文字化けしてしまうため、デコード処理を行う必要があります。
  • 文字コードに関しては勉強したが、PHP内部での処理については理解していないので、ご教授いただきたいです。
回答を見る
  • ベストアンサー

フォーム入力

お世話になります。 現在PHPをUTF-8で作成しております。 UTF-8で作成したPHP(HTML)のフォームより日本語を入力してsubmitしたとき、入力値を何も加工せずに$_POST['inputのname']で表示するときちんと文字化けせずにUTF-8で表示されているようです。 この場合、mb_encoding の関数を使用する必要はありませんよね?? また、 入力値をhtmlentities($入力値,ENT_QUOTES,'UTF-8')としてみて、このままだと日本語が入力された場合表示する文字列は文字化けしてしまうので、表示する前にhtml_entity_decode($入力値)でデコードしています。 この場合だとhtmlentitiesは特に使用する必要はないのでしょうか? エンコード→なんらかの処理→デコードとしているのですが、なんとなく必要ない気もしてきてしまいました。 文字コードについては自分なりに勉強したつもりですが、PHP内部でどのような処理が行われるかなどはよく理解できていないので、どうかご教授ください。 よろしくお願いいたしす。

  • PHP
  • 回答数1
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • randman
  • ベストアンサー率51% (17/33)
回答No.1

業務でフォームに携わるものですが、 1.入力値は必ずエンコードします。 まず、mb_detect_encodingで文字コードを解析し、次にmb_convert_encodingでエンコードします。 入力値は必ずしも予期していた文字コードとは限らないからです。 2.htmlentitiesは使いません。 エンコードさえすれば、あとはstripslashes、表示する時だけhtmlspecialcharsすれば十分だと思います。 とはいえ自分もかなりやっつけなので、参考程度に聞き流してください^^;

myaa_myu
質問者

お礼

ご回答ありがとうございます! >1.入力値は必ずエンコードします。 やはりmb_convert_encodingは使用するのですね。 実は、私の使用しておりますサーバがマルチバイト関数をサポートしていないのです。 php.iniを私が触る権限もありませんので、マルチバイト関数を使用しないでできないものかと思いました。 マルチバイト関数を使用しなくても、きちんとフォームからUTF-8の文字列が取得できるようなライブラリや 方法等がありましたら、ぜひ教えていただけないでしょうか。 >2.htmlentitiesは使いません。 ありがとうございます。 ずっとhtmlentitiesを使用することしか考えていなかったので、とても勉強になりました。 ありがとうございました。 また、マルチバイト文字列関数不使用で何かいい方法がございましたらご教授をどうかよろしくお願いいたします。

関連するQ&A

  • 入力フォームについて-ホームページ作成

    ホームページを作成をしていて、入力フォームが必要 だった為、指定したメルアドに入力内容が送られてくる 下記ソースでフォームを作成しました。 <form action="mailto:自分のメールアドレス" method="post"> ~</form> 送信後、送られてきた添付ファイルがPOSTDATA.ATTという 添付ファイルで、件名も添付ファイルの中身も文字化け している為、FormReaderという無料ソフトでデコードして みると、 (デコード前)%A4%A2%A4%A2& (デコード後)、「、「 デコード後も文字化けしてしまいます。 (入力内容は「ああ」です) formタグにENCTYEP="multipart/form-data" または enctype="text/plain"を入れても「ああ」が 、「、「 と表記されています。 何か解決方法はありますでしょうか。 また、cgi、phpについては全くの素人が、 フリーのcgiもしくはphpメールフォームを 設置することは難しいでしょうか。 急ぎで必要な為、 フリー(著作権表示もしなくてよい)で 配布しているおすすめサイトがあれば 教えてください。 よろしくお願いいたします。

  • メールフォームを入力時に文字化けになる

    先日メールフォームを作成しましたが、ある条件が揃うと入力時に文字化けをおこしてしまいます。 ある条件とはWindows OS でsafariとfirefoxのブラウザを使用しているときのみです。 入力フォームに入力する際に日本語のみ文字化けを起こしてしまいます。 日本語をコピペしたらきちんと送れるのですが、どこにトラブルがあるのでしょうか。 すべてUTF-8で記述していまして PHPのテキストの冒頭には mbstring.language = Japanese mbstring.internal_encoding = utf-8 をつけています。詳しい方、だれか教えてください。

    • 締切済み
    • PHP
  • メールフォーム セキュリティについての質問

    メールフォーム セキュリティについての質問 はじめまして。 現在PHPを勉強中で、とりあえずメールフォームを サンプル本を参考にして作ろうとしているのですが、 不明なところが出てきたので質問させていただきました。 セキュリティのために入力された文字を htmlspecialchars を使って エスケープをするのですが、それをメールで受信するときには 正常に戻した状態(デコード?)で表示したいと思い 送信するためのスクリプトの前で html_entity_decode を使って再変換しようと 考えているのですが、これはセキュリティ上良くないのでしょうか? 以下は入力画面から確認画面で送信ボタンを 押した後に読み込む送信用のPHPファイルです。 環境はPHP 5.2となります。 <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } // 文字化け対応 mb_language("Japanese"); mb_internal_encoding("UTF-8"); $to = "xx@xx.ne.jp"; $contact = "お名前:$name\nメールアドレス:$from\nタイトル:$title\n内容:$naiyou\n"; $contact = html_entity_decode($contact); if (mb_send_mail($to,$title,$contact,"From:$from")) { echo "メールを送信しました"; } else { echo "メール送信失敗です"; } ?> 以上 初心者のため質問に不備があるかもしれず 申し訳ありませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • 入力フォームの文字化け

    webサイト上からの資料請求やお問い合せでフォームを利用しています。 送信があった場合、その内容がメールで送られてくるようにしていて、送信テストを行ってみると全角ハイフン(か、全角長音)の文字が ?? に文字化けしています。 プログラムを作成した制作会社に修正依頼をしたところ… 原因として、ページ(UTF)とメールの文字コードが違いが挙げられるとのことでした。 対策としてCGI(perl)上で文字を置き換えることは可能であるが、文字化けする可能性のある文字すべてにその処理をフォームの項目のそれぞれに施すとページの表示が遅くなる。 という指摘を受けました。 お客様にフォローを入れるため正確に受け取りたいので数秒の遅延であれば対策して欲しいと言ったところ「ページ表示が遅くなって途中離脱の危険が生じる」「普通の内容を入力した人に(ページ表示が遅い)犠牲にしてまで稀少なケースに対応する考えは改めた方がいい」といった回答が返ってきています。 フォームの入力欄の数としては8個程度で、名前や住所、お問い合わせ内容などごく一般的なものです。 文字置き換えの処理はページの表示にどれほど影響するものでしょうか。 また、別な理由で文字置き換えの処理はやめた方がいいなどありましたら皆さんのご意見をお聞かせいただければ幸いです。

  • PHP フォームからのデータが文字化け

    PHPにて簡単な以下のようなアプリを勉強がてら作っています。 1.登録フォームを表示 2.確認画面表示 3.DB(MySQL)にデータ登録 そこで質問なのですが、フォームから入力し確認画面を表示するときに、フォームから入力した文字が文字化けしてしまいます(正確には文字化けする時としない時があります)。 出力ページはSmartyを使っています。 テンプレートはUTF-8を使っており、テンプレート内の文字は文字化けしません。PHPソースもUTF-8で書いてあります。 各PHPソースには mb_language("uni"); mb_internal_encoding("UTF-8"); mb_http_output("UTF-8"); と記述しています。 DB(MySQL)のテーブルはUTF-8にしてあります。 1点気になるのは、某ホスティングサービス上で作っているのですが、PHPinfoで見てみるとmb_internal_encodingはEUC-JPになっています。 今回UTF-8で作りたいのですがどうしたら良いのでしょうか? 環境は、 Apache 1.3.34 / PHP 4.3.7 / MySQL 4.1.21 です。 アドバイスお願いいたします。

    • ベストアンサー
    • PHP
  • MACのvimでの¥マーク入力について

    教えてください。 MACのvimでPHPのプログラミングを行おうとしていますが、 ¥マークを入力するには、ターミナルの環境設定で言語環境をShiftJISに設定すると optionボタン+Yのキーで¥マークを表示することができるみたいですが、 逆に日本語文字列を入力すると文字化けしてしまいます。 UTF-8に変更すれば、文字化けしないのですが、 逆に¥マークが入力できなく、バックスラッシュになります。 UTF-8で、やはりバックスラッシュで書いていくものなのでしょうか? MAC初心者で、vimを使ったことがありません。 よろしくお願いします。

  • MeのieブラウザでFedoraCore3のhtmファイル

    (UTF-8)を見に行くと文字化けします そこでデコードをいちいちUTF-8に変更しなければなりません どうしたら文字化けしないで表示できるのでしょうか?

  • フォーム入力情報を確認表示させたいのですが

    フォーム入力情報を確認表示させたいのです。 他の値はcheck.phpで表示されるのに、氏名(name)だけが表示されないのです。 原因がわからず作業が進まない状態です、、、回答よろしくお願いします。 index.html------------------------ <dt><em>氏名 </em><hi>必須</hi></dt> <dd> <input type="text" name="name" size="20" maxlength="255" value="<?php echo htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8'); ?>" /> <?php if ($error['name'] == 'blank'): ?> <p class="error"><pred>* 氏名を入力してください</pred></p> <?php endif; ?> </dd> ---------------------------------- check.php-------------------------- <dt><em>氏名</em></dt> <dd> <?php echo htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES, 'UTF-8'); ?> </dd> ----------------------------------

    • 締切済み
    • PHP
  • PHPでのお問い合わせフォームの本文のみが文字化けします。

    PHPでのお問い合わせフォームの本文のみが文字化けします。 送受信できるのですが、本文の日本語での内容のみ文字化けします。 アルファベットと数字はちゃんと表示されます。 設定をUTF-8 にしてサーバーをPHP5.0のものを使用しています。 原因不明で困っています。

    • ベストアンサー
    • PHP
  • PHP 問い合わせフォームの文字化け

    はじめまして。 会員648です。 Websiteを作成し、問い合わせフォームで 入力をHTML、チェック・確認画面、送信をPHPで 作成しました。 初心者なので、サイトでの作成事例をまねております。また文字化けは UTF-8を書けば良い ということも サイトにあったので、とりあえずそうしました。 しかし 他のHTMLは正常に表示しますが、HTMLの入力画面、PHPチェック画面 すべて  文字化けします。 入力画面は <!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <form method="post" action="check.php"> ですが 文字化け表示となります。 内容確認画面は check.php で <?php // フォームデータが空の場合は処理終了 if (empty($_POST)) { echo "処理終了"; exit; } // セッションの開始 session_start(); ?> <!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> で始まります。 詳しくPHPを知りませんので、どこが問題なのか 教えていただけませんでしょうか。 なお、テスト環境は 自分のPCで Xampp をインストールして、htdocs 配下に すべての HTML, CSS, image,php を 置いております。 なにとぞ よろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう