[PHP-users 23552]携帯サイト構築についてメモ

mlmlml @ lily.freemail.ne.jp mlmlml @ lily.freemail.ne.jp
2004年 11月 6日 (土) 12:59:51 JST


tetuoです。

PHPで携帯サイトを作る場合、internal encodingがShift-JISにしたいが*出来な
い*場合があるのではないかと思います。
(確か、Shift-JISに設定できるPHPはあったと思いますが)

携帯サイトをEUC-JPベースで作る際、実際に動いたメモを残しておきます。
(完全ではないと思いますし、世の中にはより良い方法があるかと思います。携
帯サイトをEUC-JPベースで作る方の今後の指針になればと思います。)



間違った見解等があれば指摘して下さい。



-------------------------
環境
-------------------------
PHP Version 4.3.9
'./configure' '--enable-mbstring' '--enable-mbregex'
'--with-pgsql=/usr/local/pgsql' '--with-apxs=/usr/local/apache/bin/apxs'
'--with-gd' '--enable-versioning' '--with-zlib=/usr' '--with-pnglib=/usr'
'--with-freetype-dir=/usr/local--with-jpeg-dir=/usr/local'
#EUC-JPベース

Postgresql "PostgreSQL 7.4.3 on i686-pc-linux-gnu, compiled by GCC 2.96"
#EUC-JPベースのデータベース

-------------------------
背景
-------------------------
携帯2社(Docomo、Vodafone)それぞれの絵文字の掲示板への投稿を、独自互換
テーブルにより携帯各社、PCからのアクセスによる最適な絵文字表示の実現。

※外に出しても恥ずかしくない物に仕上がるのなら、今後はwebサービスにして
みて外部提供してみたいです。(無償)


-------------------------
つまづき その1
-------------------------
今まで、PC用のサイトは幾つか作ってきたが、携帯用のサイトは作った事が無く、
EUC-JPベースのPHPでShift-JISのエンコードページを作る方法がよく分かってい
なかった。

*************************
解決方法
*************************
EUC-JPベースのままでソースは通常通り書き、表示の際はPHPの設定で対応する。

設定する項目:
PHP.iniの以下の項目の設定が必要です。
output_handler
default_charset
mbstring.language
mbstring.encoding_translation
mbstring.http_input
mbstring.http_output
mbstring.internal_encoding
mbstring.substitute_character

設定方法:
1)PHPのソースに直に書く。例:ini_set('XXXX', 'XXXX');
2).htaccessを使う。
3)PHP.iniにアクセスできるなら、直に変更する。


自分は.htaccessに設定しています。
#////////////////////////////////////////////
php_value output_handler mb_output_handler
php_value default_charset Shift_JIS
php_value mbstring.language Japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input auto
php_value mbstring.http_output SJIS
php_value mbstring.internal_encoding EUC-JP
php_value mbstring.substitute_character	none
#////////////////////////////////////////////

この設定で意味する事は、PHPのソースはEUC-JPなので、internal_encodingを
EUC-JPとし、言語のベースは日本語なのでmbstring.languageはJapaneseとする。

HTTPのデータ入出力の際、
サーバー側に入ってくる時(mbstring.http_input)はデータに一切処理を施し
てほしくないのでpassとし、output_handlerで設定しているmb_output_handler
の処理をスルーするようにします。
※mb_output_handlerはPHPの組み込み関数です。

反対にサーバーからクライアント側にでるデータはoutput_handlerで設定してい
るmb_output_handlerにSJIS(Shift-JIS)に変換してほしいので、mbstring.http_ou
tput
はSJISと設定します。

最終的にdefault_charsetをShift_JISとし、ヘッダー情報として
default_charset Shift_JIS
をPHPに自動的に設定してもらうようにします。

参考:
http://www.php.net/manual/ja/ref.mbstring.php


-------------------------
つまづき その2
-------------------------
EUC-JPベースのPHPソースを使い、Shift-JISで完全に出力する事は出来、携帯か
ら問題なく表示されるようになったが、EUCのデータベースにShift-JISのフォー
ムデータを入力する際に文字化けし、正常に登録が出来ない。

*************************
解決方法
*************************
.htaccessを使い、2層の違うレベルでHTTPの入力データを受け取る。

※これは実際に分かってやっていないのですが、.htaccessの設定をいじってみ
ると出来た結果と言うだけです。(見解が間違っている可能性があります)


例えば、以下のような階層です。
public_html
├/main
│├.htacess(上で記した、Shift-JIS出力の設定)
│├.....
│ .....
├/sjis
│├.htacess(下に記すoutput_handlerの影響を受けない設定)
│├.....
│ .....


この2階層の概要としてはこうです。/main配下にあるページにてフォームデータ
の入力をします。入力したフォームデータのaction先として/sjis配下のソース
に委ねます。この/sjis配下のソースは、output_handlerの影響がない為、
Shift-JISを素直にShift-JISとして受け取れます。
受け取った正常なShift-JISはデータベースに入力する際、SQL文字列のレベルで
mb_convert_encoding()を使って、EUCにしてやります。
例:
$sql = mb_convert_encoding($sql, "EUC-JP", "auto");

※ここが重要なのですが、絵文字のような特殊な文字コードが含まれる際、どう
も最初に提示したPHP.iniの設定だと絵文字を消してしまうようです。この為
少し設定を変えてみた.htaccessを用意しています。
個人的にはoutput_handlerがガンなのではないかと思っています。

注意!
/sjis配下のソースではoutput_handlerの設定をしていない為、うっかりクライ
アント側に出力することがないことに気を配る必要があります。ヘッダーのリダ
イレクト等を使い、エラー、結果表示等をShift-JISで出力するソースへ委ねる
必要があるかと思います。

例:
/main/xxx.php ->(form action)-> /sjis/yyy.php -> (http redirect等) ->
/main/zzz.php

使用した絵文字が消えない設定の.htaccess
#////////////////////////////////////////////
php_value output_handler none
php_value default_charset Shift_JIS
php_value mbstring.language Japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_value mbstring.internal_encoding EUC-JP
php_value mbstring.substitute_character none
#////////////////////////////////////////////



以上ですが、3日間悪戦苦闘した努力が、他に苦労している方への助けになれば
と思います。

間違っている点などありましたら指摘お願いします。


PHP-users メーリングリストの案内