ソフトバンク携帯電話向けHTMLのフォーム入力値が文字化けしてしまいます。

レンタルサーバーを使用し、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()を使用し、入力値をいろいろな文字コードに変換してみましたが、やはり文字化けしてしまいました。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/11/16 13:03:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59

ポイント40pt
<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

と統一することだと思います。

id:s3_amni

テストした結果を報告します。

まず、mbstring.encoding_translation = Off にし、'美乳'の文字コードで条件分岐し処理する方法は入力値が空になってしまいました。

そしてmbstring系の文字コードをSJISに設定する方法ですが、これで解決できました。

若干不明瞭な点はありますが、とりあえずOKということで。。。

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

2006/11/16 13:00:44

その他の回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント20pt

php.ini の mbstring 系の設定値を教えてください。


あと、携帯向けにサイトを作る時はページエンコードを Shift_JIS(CP932) にした方が問題が少ないですよ。

id:s3_amni

回答ありがとうございます。

以下に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の方もテストしてみます。

2006/11/10 13:12:14
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント20pt

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

等とすると入力にもう少し寛容になりますが、やはり実際に端末から送られてきているコードが何かが問題ですね。

id:s3_amni

ソースコードに以下を追加してみました。

mb_http_input('ASCII,JIS,EUC-JP,SJIS');

mb_detect_order('ASCII,JIS,EUC-JP,SJIS');

ですが文字化けを解消することはできませんでした。

ちなみに他のサイトのフォーム入力は正常に行われていました。

あと、Docomo,AUの端末では文字化けは起こりません。

また何かありましたらよろしくお願いします。

2006/11/10 14:06:50
id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59ここでベストアンサー

ポイント40pt
<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

と統一することだと思います。

id:s3_amni

テストした結果を報告します。

まず、mbstring.encoding_translation = Off にし、'美乳'の文字コードで条件分岐し処理する方法は入力値が空になってしまいました。

そしてmbstring系の文字コードをSJISに設定する方法ですが、これで解決できました。

若干不明瞭な点はありますが、とりあえずOKということで。。。

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

2006/11/16 13:00:44

コメントはまだありません

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

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

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

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