EUC-JPでパソコン向けに構築したサイトを携帯表示へ対応作業中、文字化けに悩まされる、、ありがちですw
携帯電話はShift-JIS以外の文字コードへ未対応の機種が多い為、必然出力をShift-JISへ統一してやる必要がある。今回はパソコン向けに制作したEUC-JPのDB・PHPスクリプト・Smartyテンプレファイルをそのまま使用しつつ、出力のみShift-JISへ変更してやるということになる。以下のサイトを見つけ、参考に諸所作業。
→ケータイ(モバイル)サイト構築ではまる:文字化け
http://www.syrup-factory.com/b/archives/2006/02/post_1.php
・環境
さくらのレンタルサーバ
Apache 1.3.37
PHP 5.2.1 (自分でインストール)
たいていあっさりShift-JIS化終了。 が、どうもフォーム部分だけ文字化けが解消しない。PEARのHTML_QuickFormを使用しているのだが、textareaへ日本語を入力して確認画面を表示しようとすると文字化けする。
試行錯誤した結果、どうやら内部エンコーディング(mbstring.encoding)が EUC-JP としてきちんと解釈されていなかったのが原因だった。
もちろん phpinfo() で mbstring.internal_encoding の値は確認した。が、どうしてきちんと解釈されてなかったのか?それはよくよくphpinfo()を確認すると、Local Value 列の mbstring.internal_encoding は EUC-JP になっていたのだが、Master Value 列の mbstring.internal_encoding は no value であったからだ。これは、php.ini側で値を設定をするのではなく、.htaccess や、phpファイル内で ini_set したとき、この状況となる。
http://ml.php.gr.jp/pipermail/php-users/2006-September/030872.html
↑あたりの記事を見ると、どうやらモジュールの中には、Master Value しかみないものがあるようだ。QuickForm はこれに該当するのかしら? そこらへんの仕組みが私にはまだピンとこない・・。
このサイトがあるサーバでは、複数のサイトを突っ込み違う文字コードを使用していたので、PHPスクリプト側で mb_internal_encoding("EUC-JP"); としていたのですが、これが仇となったようだ。よって、スクリプト側でなく、php.iniで mbstring.internal_encoding = EUC-JP としてやることで問題解消。
私の場合はphp.iniにて以下のような設定をし、
mbstring.encoding_translation = Onそして、携帯サイトのスクリプト冒頭にてこんな感じ
mbstring.http_input = auto
mbstring.internal_encoding = EUC-JP
(必要最低限の設定しかしてません)。
mb_http_output("SJIS");
ob_start("mb_output_handler");
PHPスクリプトで各値をprintさせてみると以下。
[DEBUG]mb_internal_encoding = EUC-JP
[DEBUG]mb_http_input = ASCII (フォーム確認画面時はSJISになる)
[DEBUG]mb_http_output = SJIS
ちなみに、mbstring.http_inputもきちんと設定しないとダメだった。設定前のmb_http_inputは、たしか pass 。autoへ設定後は、通常ページではASCII、フォーム確認画面などの時はきちんとSJISになった。
はてなブックマーク









