CakePHP(1.2.1.8004)で携帯サイト用の絵文字を出力するメモ。
docomo、au、SoftBankの端末から接続があった場合、絵文字を出力してみます。
ビューなどに記述した絵文字コードをキャリアに対応した絵文字に変換します。
絵文字データとして、「絵文字データベースと相互変換マッピングデータベースのJSONファイルを公開します。 : アシアルブログ」で公開されているデータを使用させていただきます。(ありがとうございます。)
Index
すること、しないこと
- 携帯端末からの絵文字入力のことをいまは考えないことにします。
- キャリアごとのビューやデータを作らず、3キャリア共通のデータ(htmlなど)に絵文字コードを埋め込みます。
- PC用の絵文字表示はしないことにします。
設定
app/configディレクトリにpictogramディレクトリを作成し、その中に上記絵文字データのファイルを置きます。
JSONのデコードに、Zend_Jsonを使います。
Zend Framework(1.7.3)へのインクルードパスをapp/config/bootstrap.phpで設定することにします。
-
// Zend Framework,PEARライブラリインクルードパス設定
-
$lib_dirpath = '/PATH/lib';
-
$include_path . ':' . $lib_dirpath . '/ZendFramework-1.7.3PL1-minimal/library' .
-
':' . $lib_dirpath . '/pear/PEAR');
-
-
// 絵文字データを格納するディレクトリ
PEARライブラリのパスの設定も.htaccessからapp/config/bootstrap.phpに移動しました。
CakePHPのシェル、タスクを使うつもりなので。
絵文字コード定義
次のような絵文字コードをhtmlなどに記述したり、データベースに格納することにします。
| docomoの絵文字コード定義 | [[emjI:docomo絵文字番号]] |
|---|---|
| auの絵文字コード定義 | [[emjE:au絵文字番号]] |
| SoftBankの絵文字コード定義 | [[emjS:softbank絵文字番号]] |
docomo絵文字番号・au絵文字番号・softbank絵文字番号は、上記絵文字データで定義された、キャリアごとに振られた絵文字番号です。
例
[[emjI:1]]をhtmlに記述すると、docomoの絵文字「晴れ」に相当する絵文字に変換します。
絵文字HTML記述
絵文字コードを次のHTML記述に変換して出力します。
| キャリア | HTML記述 | 備考 |
|---|---|---|
| docomo | &#x[UNICODE]; | 作ろうiモードコンテンツ:絵文字記述方法のUnicodeテキスト記述です。 |
| au | <img localsrc="絵文字番号"> | auの絵文字番号はこちら。 |
| SoftBank | ウェブコード |
絵文字出力処理
AppControllerクラスのafterFilterメソッドで、出力HTMLに含まれる絵文字コードを絵文字(html記述用)に変換します。
追記 2009/02/11 20:00
auの絵文字出力を<img localsrc="番号">の形を止め、utf-8コードを出力するように変更しました。
au端末で絵文字が表示されるかどうかは不明です。
-
class AppController extends Controller
-
{
-
// ...
-
function afterFilter()
-
{
-
parent::afterFilter();
-
if (!$this->_isPcOnly) {
-
// 絵文字コードをキャリアごとの絵文字に置換して、出力する
-
$this->output = my_output_filter($this->output);
-
}
-
}
-
// ...
-
}
-
function my_output_filter(&$string)
-
{
-
include_once('Zend/Json.php');
-
-
$pattern = '/\[\[emj([I,E,S]):([0-9]{1,4})\]\]/';
-
-
$replacement = 'replace_emoji4web';
-
-
return $str;
-
}
-
-
function replace_emoji4web($matches)
-
{
-
return $matches[0];
-
}
-
return '';
-
}
-
$from = '';
-
if ($matches[1] == 'I') {
-
$from = 'docomo';
-
}
-
else if ($matches[1] == 'E') {
-
$from = 'ezweb';
-
}
-
else if ($matches[1] == 'S') {
-
$from = 'softbank';
-
}
-
else {
-
return $matches[0];
-
}
-
-
$val = '';
-
if (UAGENT_KIND == UAGENT_DOCOMO) {
-
$to = 'docomo';
-
}
-
else if (UAGENT_KIND == UAGENT_AU) {
-
$to = 'ezweb';
-
}
-
else if (UAGENT_KIND == UAGENT_SB) {
-
$to = 'softbank';
-
}
-
else {
-
return '<!-- ' . $matches[0] . ' -->';
-
}
-
$val = get_emoji_html($from,$to,$matches[2]);
-
if ($val === false) {
-
return $matches[0];
-
}
-
return $val;
-
}
-
-
function get_emoji_html($from,$to,$num)
-
{
-
-
$target_num = $num;// 絵文字番号
-
if ($from != $to) {
-
if (!${$from . '_convert'}) {
-
$path = PICTOGRAM_JSON_DIR . '/' . $from .'_convert.json';
-
return false;
-
}
-
if ($data === false) {
-
return false;
-
}
-
${$from . '_convert'} = Zend_Json::decode($data);
-
}
-
-
return false;
-
}
-
-
$row = ${$from . '_convert'}[$from][$num];
-
-
return false;
-
}
-
$target_num = $row[$to];
-
$target_num = $arr[0];
-
}
-
}
-
return $target_num;// 文字
-
}
-
}
-
-
if (!${$to . '_emoji'}) {
-
$path = PICTOGRAM_JSON_DIR . '/' . $to .'_emoji.json';
-
return false;
-
}
-
if ($data === false) {
-
return false;
-
}
-
${$to . '_emoji'} = Zend_Json::decode($data);
-
}
-
-
return false;
-
}
-
$emoji_data = ${$to . '_emoji'}[$to][$target_num];
-
return make_emoji_str($to,$emoji_data);
-
}
-
-
function make_emoji_str($to,&$emoji_data)
-
{
-
if ($to == 'docomo') {
-
return false;
-
}
-
return false;
-
}
-
$str = '&#x' . $emoji_data['unicode'] . ';';
-
return $str;
-
}
-
else if ($to == 'ezweb') {
-
return false;
-
}
-
return false;
-
}
-
return $str;
-
}
-
else if ($to == 'softbank') {
-
return false;
-
}
-
return false;
-
}
-
return $str;
-
}
-
return false;
-
}
JSONデータを接続のあるたびに読み込んでいます。
非効率そうなので、適当なところでキャッシュを使うなどするつもりでいます。
表示サンプル
「・・・から接続しています。[[emjI:1]] [[emjE:1]] [[emjS:1]] [[emjI:1]]」というテキストをトップページのビューに記述したとします。
PCからFirefoxでトップページに接続すると、絵文字は表示されません。
htmlソースに、「PCから接続しています。<!-- [[emjI:1]] --> <!-- [[emjE:1]] --> <!-- [[emjS:1]] --> <!-- [[emjI:1]] -->」というように、絵文字コードはコメントアウトで出力されます。
iモードHTMLシミュレータⅡの場合は、次のような表示です。

ダウンロード
(2009/02/11 20:00)ファイルを差し替えました。
auの絵文字出力方法を変更しました。
(au端末での絵文字表示は確認しておりません。)
アーカイブへのリンクを「ダウンロード(「CakePHPで携帯サイトを作る」のサンプル)」に移動しました(2009/02/11)。