[PHP-users 6990] i-mode対策の報告

gzl03577 php-users@php.gr.jp
Fri, 19 Apr 2002 06:32:37 +0900


kumaといいます。長文です。

php.iniをいじらないi-mode対策を報告します。

・phpスクリプトに絵文字を直接記述する場合
・phpスクリプトに絵文字を送信する場合

約9ケ月使っていますが、問題はでていません。
ご意見もお待ちしております。


php3 + i18 です。

[ php.ini ]
------------------------------
i18n_internal_encoding = EUC-JP
i18n_script_encoding = auto
i18n_http_output = SJIS
i18n_http_input = auto
i18n_http_input_default = SJIS


[ phpスクリプトに絵文字を直接記述する場合 ]
------------------------------
 1: <?
 2: // アイウエオあいうえお
 3: // カキクケコかきくけこ
 4: // サシスセソさしすせそ
 5: // タチツテトタチツテト
 6: // ナニヌネノなにぬねの 
 7: i18n_http_output('pass');
 8: ?>
 9: [絵文字の1] メニュー1
10: [絵文字の2] メニュー2
11: [絵文字の3] メニュー3
------------------------------
サーバーの文字コードは<SJIS>

2〜6行 <EUC-JP記述部>
ファイル先頭に ****EUC-JP**** でphpコメントを記述します。
このスクリプトの文字コードをEUC-JPと認識させれば、
スクリプト読み込み時の文字コード変換がありません。

7行
出力時の文字コード変換なしにしておきます。

9行〜 <SJIS記述部>
絵文字を &#xxxxx; 形式はもちろん記述できますが、
page-iから、直接記述も可能です。

<<注意>>
require、include 先のファイルに絵文字を記述したい場合は、
それらのファイルも、同様の仕掛けをする必要があります。



[ phpスクリプトに絵文字を送信する場合 ]
フォームの先頭で、隠しフォーム変数[絵文字のハート]を送信する
------------------------------
 1: <?
 2: // アイウエオあいうえお
 3: // カキクケコかきくけこ
 4: // サシスセソさしすせそ
 5: // タチツテトタチツテト
 6: // ナニヌネノなにぬねの 
 7: i18n_http_output('pass');
 8: ?>
 9: <form action="hoge.php3">
10: <input type=hiden name=a  value="<絵文字のハート>">
11: <input type=hiden name=aa value="あ">
12: <input type=text  name=hoge>
------------------------------

サーバーの文字コードは「SJIS」

2〜6行 <EUC-JP記述部>
ファイル先頭に<EUC-JP>でphpコメントを記述します。
このスクリプトの文字コードをEUC-JPと認識させれば、
スクリプト読み込み時の文字コード変換がありません。

7行
出力時の文字コード変換なしにしておきます。

9行 <SJIS記述のフォームの開始>
method=GET method=POST どちらもOKです。

10行 
ダミーの隠し変数、その1
フォーム変数の先頭に a=<絵文字のハート>

<フォーム先頭>で<EUC-JP>な値のダミー変数を送信します。
するとphpは、フォーム変数をEUC-JPと認識し、
http_input時の文字コード変換をしません。

しかし、なぜか<絵文字のハート>で期待どおりの動きになりました。
<絵文字のハート>をEUC-JPと認識しているのでしょうか...
結果オーライでそのままにしてあります。


11行 
ダミーの隠し変数、その2
送信先phpで、文字コード変換があったかどうかの確認用
(基本的に開発用です)

if( "$aa" == "あ" ) // "あ"はSJIS
{
    http_input時の文字コード変換はなかった
}
else
{
    http_input時の文字コード変換があった
}

12行〜
本当のフォームの開始。

<<注意>>
これらのフォーム変数は、送信先phpのメモリ上ではSJISです。
(そのための対策ですから)
そのままファイルやデータベースに保存すると、SJISで保存されます。

以上