PHPでケータイのFlash対応・非対応を判定できる関数を作ってみました
    このエントリをはてなブックマークに登録

2008/3/18 火曜日 matsui Posted in Flash, PHP 7 Comments »

ケータイコンテンツでよくある処理に、Flash対応端末であればFlashを、非対応端末であれば画像を出すという処理があります。

今までは、定義ファイルやデータベース内にデータを持って、対応・非対応を判定していたのですが、設置等が面倒ですし、動作も遅いです。
今後発売されるほぼ全ての機種は、Flash対応端末となりそうな感じなので、判定処理をPHPで関数化してみました。

ご利用上の注意事項です。

  • 2008年3月18日時点での端末リストでテストしています
  • 今後はFlash非対応端末が出ないということ、端末の命名規則が大きく変わらないことを仮定しています
  • もしFlash非対応端末が出たり、命名規則を外れた端末が出た場合は、適宜プログラムを修正してください。

ソフトバンクの公式サイトにFlashへの対応状況が載っておらずよくわからないので、こちら [neu.co.jp]のページを参考にしてみました。

 

if (isEnableFlash($_SERVER['HTTP_USER_AGENT'])) {
    echo 'Flash対応';
} else {
    echo 'Flash非対応';
}

/**
 * Flash対応判定
 */
function isEnableFlash($agent)
{
    if (preg_match('/^J\\-PHONE|MOT\\-/', $agent)) {
        // J-PHONE, Vodafoneの一部
        return false;
    } elseif (preg_match('/^Vodafone/', $agent)) {
        // Vodafone
        if (preg_match('/SH|SHf|SE\\//', $agent)) {
            return true;
        } else {
            return false;
        }
    } elseif (preg_match('/^SoftBank/', $agent)) {
        // SoftBank
        if (preg_match('/\\/70[0-9]|805SC/', $agent)) {
            return false;
        } else {
            return true;
        }
    } elseif (preg_match('/^DoCoMo\\/1\\.0\\//', $agent)) {
        // DoCoMo mova
        if (preg_match('/[A-Z]{1,2}50[56]i/', $agent)) {
            // 505i, 506i
            return true;
        } else {
            return false;
        }
    } elseif (preg_match('/^DoCoMo\\/2\\.0\\ /', $agent)) {
        // DoCoMo FOMA
        if (preg_match('/[NP]200[12]|[FN]2051|210[12]V|N2701|NM850iG|
F880iES|N600i|L60[0-2]i/', $agent)) {  ※
            // FOMAの一部非対応機種
            return false;
        } else {
            return true;
        }
    } elseif (preg_match('/UP\\.Browser/', $agent)) {
        // au
        if(preg_match('/^KDDI/', $agent)) {
            // au(HTML-OK)
            if (preg_match('/KDDI\\-ST2[4-9]|CA2[78]|KC2[7-9]|SA29/'
, $agent)) {  ※
                return true;
            } elseif (preg_match('/KDDI\\-[A-Z]{2}2[1-9]|HI3[12]|
KC[3U]1/', $agent)) {  ※
                return false;
            } else {
                return true;
            }
        } else {
            // au(HDML-Only)
            return false;
        }
    } else {
        // その他PC等
        return true;
    }
}

※表示の関係で折り返している部分があります。実際には1行で記述してください。

本サイトのスペック一覧リストを通してテストしましたのでおそらく大丈夫だと思いますが、もし間違い等がありましたら、ぜひご指摘をお願いします。

 

関連:



ディノのblogに携帯向け「XHTMLを出力する場合に便利なPHPのパッチ」が公開されています
    このエントリをはてなブックマークに登録

2008/3/7 金曜日 matsui Posted in PHP No Comments »

ディノオープンラボラトリのブログに「XHTMLを出力する場合に便利なPHPのパッチ」というものが公開されています。

→ ディノオープンラボラトリ 携帯向けXHTMLを出力する場合に便利なPHPのパッチ [dino.co.jp]

 

ドコモ端末でCSSを表示するには、Content-Typeが「application/xhtml+xml」でなくてはなりません。

通常通りではCSSが有効にならないため、PHPのプログラム上で、

header("Content-type: application/xhtml+xml");

と書いたり、

.htaccessで

AddType application/xhtml+xml .html

と指定したりします。

しかしながら上記の方法では、mb_output_handler関数による文字エンコーディング変換が効かないとのことです。
mb_output_handlerの仕様で、「Content-Type: text/*」の場合しか変換をかけていないようです。

今回ご紹介したパッチはこれを回避するためのものです。
パッチはPHP5.2.5用の物のようですが、修正箇所が少ないため、少しソースを読めば他のバージョンでも適用することができそうです。
またPHP自体にパッチを当てているため、動作スピードも早いと思われます。

XHTML+mb_output_handlerでお困りの方は、ぜひ試してみるとよいと思います。

 

関連:



symfony用の絵文字プラグイン「sfPictogramMobilePlugin」
    このエントリをはてなブックマークに登録

2008/3/5 水曜日 matsui Posted in PHP No Comments »

アシアルブログにsymfony用の絵文字プラグイン「sfPictogramMobilePlugin」が公開されています。

→ アシアルブログ symfonyの携帯絵文字プラグインを作りました [asial.co.jp]

 

このプラグインには大きく分けて2つの機能があるとのことです。

  1. 絵文字バイナリを丸ごと取得(テンプレート作成用)
  2. 絵文字データ変換(ユーザ投稿データ解析用)

1は絵文字を表示するための機能

使用例:
プログラム側

$emoji = $picObject->getFormattedPictogramsArray();

テンプレート側

<?= $data->emoji[1] ?>

2は受け取った絵文字を変換するための機能
使用例:

$convert_data = $picObject->convert($input_data);

とのことです。

PHP4のサポートが終わり、続々とPHP5への移行が進んでいると思います。
今後はこのようなフレームワーク用のプラグインに需要が集まるかもしれません。

また、全く別のサイトですが、他にも次のようなプラグインも見つけました。
→ symfonyで開発日記 モバイル端末の情報を取得するプラグイン [symfony.jp]

symfonyをお使いの方はチェックしてみてはいかがでしょうか。

 

関連:



PHP用のケータイ向けライブラリ「PEAR::Net_UserAgent_Mobile」が0.31にバージョンアップ
    このエントリをはてなブックマークに登録

2008/2/18 月曜日 matsui Posted in PHP No Comments »

PEARのNet_UserAgent_Mobileが、2008年2月10日付けで0.31にバージョンアップされていたようです。
ほぼ1年ぶりのアップデートとなります。

→ PEAR :: Package :: Net_UserAgent_Mobile [php.net]

 

主な変更内容は、次の通りです。

  • サポート機種の追加
  • singleton()の挙動変更(キャッシュ作成)
  • Vodafone→SoftBankへの変更(クラス名変更、isSoftBank()の追加など)
  • AirHPhone→Willcomへのクラス名変更
  • isMobile()、isWillcom()の追加
  • エミュレータ端末のサポート
  • Net_UserAgent_Mobile_NonMobileクラスからのgetDeviceID()削除
  • Net_UserAgent_Mobile_CommonクラスへのgetModel()、getRawModel()の追加

利用されている方も多いと思いますので、要チェックです。

 

関連:



携帯サイトでSmartyを使う場合の注意点
    このエントリをはてなブックマークに登録

2008/2/12 火曜日 matsui Posted in PHP 1 Comment »

「ケータイサイトにSmartyを使おうとしたがうまくいかない」という質問をよく受けることがあるので、注意点をまとめてみます。

問題となるのは、文字コードに「Shift_JIS」を使った場合です。
最近は対応端末が増えたため、UTF-8でページを作る場合も多いですが、過去の資産やら、互換性の問題やらでShift_JISを使うこともあります。

ところがSmartyではSJISは使えません。
なぜなら、Smartyの標準のデリミタである

{ 」 (0x007b)、  「 } 」 (0x007d)

を、SJIS文字列が含んでしまっていることがあるからです。
(つまり必ずしもエラーにはならないことに注意が必要です)

エラーが起こった場合には次のようなメッセージが表示されます。

Fatal error: Smarty error: [in path/to/tpl.html line 10]: syntax error: unrecognized tag: ‹ (Smarty_Compiler.class.php, line 446) in /path/to/Smarty/Smarty.class.php on line 1095

これを回避するには、主に次の2つの方法があります。

 

1. デリミタを変更する

波カッコが悪さをしているので、それを変更してしまえば大丈夫です。
次のようにしてデリミタを変更することができます。

$smarty->left_delimiter = '{{';
$smarty->right_delimiter = '}}';

デリミタを変更した場合は、テンプレート内の他のSmartyタグも忘れずに変更しましょう。

修正前 : {$hoge}
修正後 : {{$hoge}}

他にも「<{$hoge}>」なんかを使う人もいます。この辺りは好みの問題です。

 

2.プリフィルタとポストフィルタを設定する

プリフィルタとポストフィルタを設定することで、Smartyでテンプレートが処理される際に、テンプレートがEUC-JPとして処理され、その後再びSJISとなって出力されます。

※この方法を使った場合には、ドコモのSJIS形式の絵文字が文字化けしてしまうので注意が必要です。
絵文字を使いたい場合はSJIS方式ではなく、&xxxxx;方式で書きましょう。

$smarty->register_prefilter("convert_encoding_to_eucjp");
$smarty->register_postfilter("convert_encoding_to_sjis");

//--------------------------------
// Smarty SJIS対応用関数1
//--------------------------------
function convert_encoding_to_eucjp($template_source) {
    if (function_exists("mb_convert_encoding")) {
        //文字コードを変換する
        return mb_convert_encoding($template_source, "EUC-JP", "SJIS");
    }
    return $template_source;
}

//--------------------------------
// Smarty SJIS対応用関数2
//--------------------------------
function convert_encoding_to_sjis($template_source) {
    if (function_exists("mb_convert_encoding")) {
        //文字コードを変換する
        return mb_convert_encoding($template_source, "SJIS", "EUC-JP");
    }
    return $template_source;
}

 

3. 検証

検証は文字コードの中に「{」や「}」を含んでいる文字を書いてやればOKです。
(例:「閲」「厭」「宮」「急」「鶏」「迎」など)

例えば「鶏を迎え討つ」などとSJISテンプレートに記載し、表示されれば大丈夫ということになります。

 

4. まとめ

  • Smartyは、そのままではShift_JISは使えない
    (ただし半端に動作することに注意)
  • SJISを使いたい場合は、デリミタを変えるか、プリフィルタ・ポストフィルタを使う
  • 検証は「閲」「厭」「宮」「急」「鶏」「迎」などで

 

関連: