PHP初心者です。共通URLで携帯、PC双方から閲覧できる簡易なサイトを作っています。


POSTで値を渡したときに、入力値がひらがなだと文字化けしてしまうのですが、その対策を調べたところ「入力エンコードが特定できないため難しい」というのが大半の見解でした。「hiddenでvalue="あ"を入れると良い」という話もありましたが、試したところガセでした。

なおソースのエンコードは携帯に対応させるためSJISとしています。

明確なソリューションをご存知の方、ご教授いただけると幸いです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/06/19 18:12:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント35pt

応急処置ですが、たとえば hoge というPOST変数で渡す場合、

mb_convert_encoding($_POST['hoge'], 'SJIS', 'EUC-JP,UTF-8');
または
mb_convert_encoding($_POST['hoge'], 'SJIS', 'auto');

のようにしてみてください。

関数 mb_convert_encoding を利用し、自動的に SJIS に変換します。


携帯サイト(HTML)もPHPスクリプトを置いているのと同じサーバにあるということですよね。

であれば、原因として、"php.ini" の設定のうち

  • mbstring.http_input
  • mbstring.internal_encoding

の2つが正しくないのかもしれません。

抜本的対策は、拙作「ページ間での文字化けを解消する」をご参考ください。

id:satoshi07

いつもありがとうございます。

・mbstring.http_input を pass にする

・mbstring.internal_encoding をSJISする

・POST 渡しする側の HTML フォームを SJIS

を行った上で実行したところ、以下のエラーが出ました。

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in ...

なおPHP Versionは 5.2.9なので、mb-convert-encodingは使えるはずですよね。

2009/06/19 13:06:05

その他の回答1件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633ここでベストアンサー

ポイント35pt

応急処置ですが、たとえば hoge というPOST変数で渡す場合、

mb_convert_encoding($_POST['hoge'], 'SJIS', 'EUC-JP,UTF-8');
または
mb_convert_encoding($_POST['hoge'], 'SJIS', 'auto');

のようにしてみてください。

関数 mb_convert_encoding を利用し、自動的に SJIS に変換します。


携帯サイト(HTML)もPHPスクリプトを置いているのと同じサーバにあるということですよね。

であれば、原因として、"php.ini" の設定のうち

  • mbstring.http_input
  • mbstring.internal_encoding

の2つが正しくないのかもしれません。

抜本的対策は、拙作「ページ間での文字化けを解消する」をご参考ください。

id:satoshi07

いつもありがとうございます。

・mbstring.http_input を pass にする

・mbstring.internal_encoding をSJISする

・POST 渡しする側の HTML フォームを SJIS

を行った上で実行したところ、以下のエラーが出ました。

Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in ...

なおPHP Versionは 5.2.9なので、mb-convert-encodingは使えるはずですよね。

2009/06/19 13:06:05
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント35pt

「function が無いよ」エラーではないので、mb_convert_encoding は使えると思います。念のため、phpinfo を実行して、mbstring の項目が表示されることを確認してください。


次に、下記だけの変更で状況が改善するかどうか確認してください。

・mbstring.http_input を pass にする 
・mbstring.internal_encoding をSJISする 

それでもダメなようでしたら、mb_convert_encoding を使います。

エラーの原因は第3引数の 'auto' が効いていないのかもしれません。

まず、

mb_convert_encoding($_POST['hoge'], 'SJIS', 'EUC-JP,UTF-8');

にしてみてください。

それでもうまくいかないようでしたら、関数 mb_language で日本語を指定してみてください。

mb_language('ja');
mb_convert_encoding($_POST['hoge'], 'SJIS', 'auto');

mb_languageはプログラムの冒頭で指定するのが more better です。

id:satoshi07

解決しました。

ありがとうございました。

2009/06/19 18:12:29
  • id:standard_one
    "あ"ではなく"あいうえお眉幅"でもう一回チャレンジして、それから質問されてみる手もありますよ。
  • id:satoshi07
    <INPUT type="hidden" name="encode_hint" value="あいうえお眉幅">
    で試しましたが、残念ながら駄目でした。
    ありがとうございます!
  • id:munyaX
    > Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect
    > character encoding in ...

    mb_convert_encoding自体は使えているようですが、エンコードが
    うまいこと出来ていないようです。

    ↓ここらへんを試されてみてはどうでしょうか?
    http://metaboy.blog23.fc2.com/blog-entry-91.html


    > なおPHP Versionは 5.2.9なので、mb-convert-encodingは使えるはずですよね。

    今回のケースは大丈夫そうですが、php.iniでコメントアウトされているなどの
    場合もありますので、PHPのバージョンでの判断はさけられた方が良いかもしれ
    ません。

    extension=php_mbstring.dll

    ご参考までに。
  • id:satoshi07
    mbstring.language = Japanese
    はphp.iniですでに試していたのですが、スクリプト前でも試してみました。
    が、残念ながら駄目でした。
    ありがとうございます。

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

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

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

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