人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ソフトバンク携帯電話向け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()を使用し、入力値をいろいろな文字コードに変換してみましたが、やはり文字化けしてしまいました。
よろしくお願いします。

●質問者: s3_amni
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:2.0 Apache ASCII echo EUC-JP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●20ポイント

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


2 ● b-wind
●20ポイント

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の端末では文字化けは起こりません。

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


3 ● tobeoscontinue
●40ポイント ベストアンサー
<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ということで。。。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ