レンタルサーバーを使用し、WebサーバソフトウェアはApache 2.0.54、サーバーサイドスクリプトはPHP 5.0.4を使用しています。
以下に問題のソースを記述します。
--------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
<title>テスト</title>
</head>
<?php
echo "内部エンコーディング:".mb_internal_encoding()."<br />" ;
echo "入力値のエンコーディング:".mb_detect_encoding($_POST["text"], "auto")."<br />" ;
echo "入力値 :".$_POST["text"]."<br />" ;
?>
<form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="text" />
<input type="submit" value="送信"/>
</form>
<body>
</body>
</html>
--------------------------------------------------
例えば、"あいうえお"を送信すると以下のように表示されます。
--------------------------------------------------
内部エンコーディング:EUC-JP
入力値のエンコーディング:ASCII
入力値:??????
--------------------------------------------------
mb_convert_encoding()を使用し、入力値をいろいろな文字コードに変換してみましたが、やはり文字化けしてしまいました。
よろしくお願いします。
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
をshift_jisに変えることで同じ様に文字化けします(PCのブラウザーにて)
このことからソフトバンク携帯電話側からは想定外のshift_jisで送出されているものと思います(携帯のブラウザーかソフトバンク側かわかりませんが)
mbstring.encoding_translation = On
となっているのでPHPスクリプトの時点では$_POST["text"]の値は既に??????となっており、これから元に戻すことはできません。
変換される前の$_POST["text"]の値にアクセスできればいいのですが探したかぎりでは見つかりませんでした。
http://jp2.php.net/manual/ja/ref.mbstring.php]
>PHP スクリプトで HTTP 入力文字変換を制御する手段はありません。
>HTTP 入力文字変換を無効にするには、php.ini で行う必要があります。
とあるのでphp.iniか.htaccessに権限が無と解決できないと思います。
mbstring.encoding_translation = Off
にしてPHPスクリプトで
$_POST["text"] = mb_convert_encoding($_POST["text"], "EUC-JP", "SJIS");
と自前で意識的に変換することで解決できると思います。が$_POST["text"]がEUC-JPかSJISかを判定するのは難しいと思います。
EUC-JPとSJISではコードが重複しているので例えば『あいうえお』だけではどちらかか確定できません。
<input type="hidden" name="magic" value="美乳" />
として(携帯ではhiddenは使えるんだろうか)
$encode = mb_detect_encoding($_POST["magic"], "SJIS,EUC-JP"); if ($encode === 'SJIS') $_POST["text"] = mb_convert_encoding($_POST["text"], "EUC-JP", "SJIS");
magicの値でEUC-JPかSJISかを判定するようにすればいけるとは思いますが
一番問題無い方法は
mbstring.http_input = SJIS
mbstring.http_output = SJIS
mbstring.internal_encoding = SJIS
と統一することだと思います。
php.ini の mbstring 系の設定値を教えてください。
あと、携帯向けにサイトを作る時はページエンコードを Shift_JIS(CP932) にした方が問題が少ないですよ。
回答ありがとうございます。
以下にmbstring系の設定値を記述します。
output_buffering = On
output_handler = mb_output_handler
default_charset = EUC-JP
mbstring.detect_order = auto
mbstring.encoding_translation = On
mbstring.func_overload = Off
mbstring.http_input = EUC-JP
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.language = Japanese
mbstring.strict_detection = Off
mbstring.substitute_character = auto
*mbstring.script_encodingはわかりませんでした。
Shift_JISの方もテストしてみます。
http://www.hizlab.net/app/phppg.html
よくある mbstring.http_input = auto による文字コードの判定ミスかと思ったんですが、EUC_JP 決めうちなので違うようですね。
mbstring.http_input = ASCII,JIS,EUC-JP,SJIS mbstring.detect_order = ASCII,JIS,EUC-JP,SJIS
等とすると入力にもう少し寛容になりますが、やはり実際に端末から送られてきているコードが何かが問題ですね。
ソースコードに以下を追加してみました。
mb_http_input('ASCII,JIS,EUC-JP,SJIS');
mb_detect_order('ASCII,JIS,EUC-JP,SJIS');
ですが文字化けを解消することはできませんでした。
ちなみに他のサイトのフォーム入力は正常に行われていました。
あと、Docomo,AUの端末では文字化けは起こりません。
また何かありましたらよろしくお願いします。
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
をshift_jisに変えることで同じ様に文字化けします(PCのブラウザーにて)
このことからソフトバンク携帯電話側からは想定外のshift_jisで送出されているものと思います(携帯のブラウザーかソフトバンク側かわかりませんが)
mbstring.encoding_translation = On
となっているのでPHPスクリプトの時点では$_POST["text"]の値は既に??????となっており、これから元に戻すことはできません。
変換される前の$_POST["text"]の値にアクセスできればいいのですが探したかぎりでは見つかりませんでした。
http://jp2.php.net/manual/ja/ref.mbstring.php]
>PHP スクリプトで HTTP 入力文字変換を制御する手段はありません。
>HTTP 入力文字変換を無効にするには、php.ini で行う必要があります。
とあるのでphp.iniか.htaccessに権限が無と解決できないと思います。
mbstring.encoding_translation = Off
にしてPHPスクリプトで
$_POST["text"] = mb_convert_encoding($_POST["text"], "EUC-JP", "SJIS");
と自前で意識的に変換することで解決できると思います。が$_POST["text"]がEUC-JPかSJISかを判定するのは難しいと思います。
EUC-JPとSJISではコードが重複しているので例えば『あいうえお』だけではどちらかか確定できません。
<input type="hidden" name="magic" value="美乳" />
として(携帯ではhiddenは使えるんだろうか)
$encode = mb_detect_encoding($_POST["magic"], "SJIS,EUC-JP"); if ($encode === 'SJIS') $_POST["text"] = mb_convert_encoding($_POST["text"], "EUC-JP", "SJIS");
magicの値でEUC-JPかSJISかを判定するようにすればいけるとは思いますが
一番問題無い方法は
mbstring.http_input = SJIS
mbstring.http_output = SJIS
mbstring.internal_encoding = SJIS
と統一することだと思います。
テストした結果を報告します。
まず、mbstring.encoding_translation = Off にし、'美乳'の文字コードで条件分岐し処理する方法は入力値が空になってしまいました。
そしてmbstring系の文字コードをSJISに設定する方法ですが、これで解決できました。
若干不明瞭な点はありますが、とりあえずOKということで。。。
ありがとうございました。
テストした結果を報告します。
まず、mbstring.encoding_translation = Off にし、'美乳'の文字コードで条件分岐し処理する方法は入力値が空になってしまいました。
そしてmbstring系の文字コードをSJISに設定する方法ですが、これで解決できました。
若干不明瞭な点はありますが、とりあえずOKということで。。。
ありがとうございました。