PHPで簡単なアプリを作っています。

HTMLフォームとのやり取りで文字化けが出てしまいました。
色々調べてみたのですが混乱して分からなくなりました。
ホスティングを契約しているのですが、以下の環境の場合でPOSTされたデータ($_POST)の文字コードは何になっていると予想できるか教えてください。PHPソースはUTF-8、HTMLもUTF-8で作っています。
サーバ
PHP Version 4.3.7
phpinfoの値
mbstring.detect_order auto
mbstring.encoding_translation On
mbstring.func_overload 0
mbstring.http_input auto
mbstring.http_output SJIS
mbstring.internal_encoding EUC-JP
mbstring.language Japanese
mbstring.script_encoding auto
mbstring.substitute_character no value

お願いいたします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2008/01/26 00:33:42
  • 終了:2008/01/28 13:24:21

ベストアンサー

id:tezcello No.2

tezcello回答回数459ベストアンサー獲得回数692008/01/26 15:34:50

ポイント35pt

> UTF-8で作ってあり、「charset=utf-8」とHTMLに書いているのですが、ブラウザが「Shift-JIS」と認識し文字化けします。

これは、mbstring の設定が

> mbstring.http_output SJIS

となっているからではないでしょうか?

http://www.php.net/manual/ja/function.mb-http-output.php


charset を記述しているのは、meta タグの中にでしょうか?

ブラウザは、先ずWebサーバからのHTTPヘッダからエンコードを判別しようとします。

mbstring.http_output が指定してあると、その値が使われるのだったと記憶しています。

UTF-8 を指定しておくか、

pass にしておいて、UTF-8 であるとヘッダを出す

mb_http_output('pass');

あるいは、ini_set('mbstring.http_output', 'pass'); をスクリプトに記述しておいて

header('Content-Type: text/html; charset="UTF-8"');

とご希望通りになると思います。


回答数制限になるので、コメント欄を開けてもらえればありがたいです。

id:norif_h

ありがとうございます。

とりあえずスクリプトに

ini_set('default_charset', 'UTF-8');

ini_set('mbstring.http_input', 'auto');

ini_set('mbstring.http_output', 'UTF-8');

ini_set('mbstring.internal_encoding', 'UTF-8');

.htaccessに

php_flag mbstring.encoding_translation OFF

と記述したら上手くいきました。

サーバーの設定に影響されないような記述をしたいのですが

上記の感じで良いのでしょうか。

必要ないものはあるでしょうか?

また、「mbstring.encoding_translation」はソース内に書けないのですよね。

php.iniを弄れない場合、.htaccessに書くしかないんですよね。

お願いします。

コメント欄開けておきました。

2008/01/26 16:59:25

その他の回答(1件)

id:tezcello No.1

tezcello回答回数459ベストアンサー獲得回数692008/01/26 08:46:25

ポイント35pt

> mbstring.encoding_translation On

> mbstring.http_input auto

> mbstring.internal_encoding EUC-JP

この辺りから、EUC ではないかと。


僕は、勝手に換えられると分らなくなってしまうので

ini_set('mbstring.http_input', 'pass'); をスクリプトに記述しておく

php_flag mbstring.encoding_translation OFF を.htaccess に記述しておく

をやっています。


http://www.php.net/manual/ja/ref.mbstring.php

id:norif_h

ありがとうございます。

教えていただいたとおり設定すると、出力されるページの文字コードが「Shift-JIS」になってしまいます。

UTF-8で作ってあり、「charset=utf-8」とHTMLに書いているのですが、ブラウザが「Shift-JIS」と認識し文字化けします。

2008/01/26 14:49:46
id:tezcello No.2

tezcello回答回数459ベストアンサー獲得回数692008/01/26 15:34:50ここでベストアンサー

ポイント35pt

> UTF-8で作ってあり、「charset=utf-8」とHTMLに書いているのですが、ブラウザが「Shift-JIS」と認識し文字化けします。

これは、mbstring の設定が

> mbstring.http_output SJIS

となっているからではないでしょうか?

http://www.php.net/manual/ja/function.mb-http-output.php


charset を記述しているのは、meta タグの中にでしょうか?

ブラウザは、先ずWebサーバからのHTTPヘッダからエンコードを判別しようとします。

mbstring.http_output が指定してあると、その値が使われるのだったと記憶しています。

UTF-8 を指定しておくか、

pass にしておいて、UTF-8 であるとヘッダを出す

mb_http_output('pass');

あるいは、ini_set('mbstring.http_output', 'pass'); をスクリプトに記述しておいて

header('Content-Type: text/html; charset="UTF-8"');

とご希望通りになると思います。


回答数制限になるので、コメント欄を開けてもらえればありがたいです。

id:norif_h

ありがとうございます。

とりあえずスクリプトに

ini_set('default_charset', 'UTF-8');

ini_set('mbstring.http_input', 'auto');

ini_set('mbstring.http_output', 'UTF-8');

ini_set('mbstring.internal_encoding', 'UTF-8');

.htaccessに

php_flag mbstring.encoding_translation OFF

と記述したら上手くいきました。

サーバーの設定に影響されないような記述をしたいのですが

上記の感じで良いのでしょうか。

必要ないものはあるでしょうか?

また、「mbstring.encoding_translation」はソース内に書けないのですよね。

php.iniを弄れない場合、.htaccessに書くしかないんですよね。

お願いします。

コメント欄開けておきました。

2008/01/26 16:59:25
  • id:tezcello
    > また、「mbstring.encoding_translation」はソース内に書けないのですよね。
    そういう仕様なので、しかたないですねぇ...

    それ以外は、以下のようなのを決まり文句としてスクリプトの最初に書いています。
    (今までに何回か回答などに書いて来ましたので、見飽きた人もいるでしょうが)

    define(SITE_LANG,'ja');
    define(SITE_CHARSET,'UTF-8');

    set_magic_quotes_runtime(false);
    ini_set('mbstring.http_input', 'pass');
    ini_set('mbstring.http_output', 'pass');
    mb_language('SITE_LANG');
    mb_internal_encoding('SITE_CHARSET');
    mb_regex_encoding('SITE_CHARSET');

    一旦定数化しているのは、別な所でも使うかもと思っているからで、特に意味はないです。
    http入力も出力も pass にしてしまっているので自分で意識的に変換しなければいけませんが、勝手に変換されてしまってなかなか気が付かない...って事が過去に多くあったのでこうしています。
    UTF-8 なのは、xml が増えるかなぁと思っているからで、別にEUCでもいいんですけど。
    (Shit-JIS でないのは、preg系の正規表現が使いたいからです)


    日本語関係以外にも、デバッグ時は
    ini_set("display_errors","1");
    ini_set("display_startup_errors","1");
    としておくと、エラーを表示してくれるのでとても助かります(ダメな時もありますが)。
    ただし、本番時はコメントアウトしておくべきですね。(セキュリティ上推奨されています)

    デバッグ時は、あちらこちらで var_dump などを使うので、文字化けで読めない事が良くあります。
    なので、
    header("Content-Type: text/html; charset=".SITE_CHARSET);
    を書いておく事も多いです。(この為に、ウォーニングが出る事もたまにはありますが...)

  • id:norif_h
    tezcello 様
    ありがとうございます。大変勉強になりました。
    PHPを勉強しだしたのですが、どのオプションがどういう働きをするのかいまいち理解できないでいました。参考にさせていただきます。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません