Tech
Webシステムプログラマーによる、ちょっとためになる(かもしれない)情報共有ブログ
 

【第66回】絵文字の出力について(その4)

 
今回は前回の続きで絵文字の出力についてです。

絵文字の出力方法については、次のパターンがあることは前回も書きました。

1.3キャリアそれぞれのHTMLテンプレートを用意して、それぞれのキャリアに応
じた絵文字を書く方法。

2.キャリアごとに絵文字の配列を作り、キャリアに応じた絵文字を表示する方法

3.iモード用の絵文字を書いたテンプレートを用意して、それをezweb、Softbank
用に変換して出力させる方法

4.絵文字用にタグを作っておいて、タグから絵文字に変換して出力する方法。

前回は3のiモード用の絵文字を書いたテンプレートを用意してキャリアに応じた
絵文字に変換する方法について、とても簡単なサンプルを作りました。

今回は4の絵文字タグが入ったテンプレートを用意してキャリアに応じた絵文字
に変換する方法です。

とても簡単なサンプルを作ってみます。
今回は、絵文字用のCSVファイルを作ります。

(emoji.csv)
1,晴れ,,,
2,曇り,,,
3,雨,,,
4,雪,,,

記事のスペースの関係で今回もデータは4つだけ入れています。

今回の絵文字データはUnicodeを使っています。

絵文字番号、名前、i-mode絵文字のUnicode、au絵文字のUnicode、Softbank絵文
字のUnicode

の順に入れています。

次に次のようなプログラムを作ります。
(emoji_test.php)
<?

/**
* DoCoMo端末の確認
*
*/

function is_docomo(){

// ユーザーエージェントの取得
$agent = $_SERVER['HTTP_USER_AGENT'];

// キャリアの判別
if(ereg("^DoCoMo", $agent) && !eregi( "ISIM", $agent )){

return TRUE;

}else {

return FALSE;

}
}

/**
* au端末の確認
*
*/

function is_au(){

// ユーザーエージェントの取得
$agent = $_SERVER['HTTP_USER_AGENT'];

// キャリアの判別
if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){

return FALSE;

}

// キャリアの判別
if(strpos($agent,"KDDI-") !== FALSE || strpos($agent,"UP.Browser/")
!== FALSE){

return TRUE;

} else {

return FALSE;

}
}

/**
* Softbank端末の確認
*/

function is_softbank(){

// ユーザーエージェントの取得
$agent = $_SERVER['HTTP_USER_AGENT'];

// キャリアの判別
if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){

return TRUE;

} else {

return FALSE;
}
}


/**
* 絵文字タグから絵文字に変換する
*/
function dec_emoji_output($buffer){

// 出力文字データの初期化
$output = "";

// 入力データがない場合は終了
if(empty($buffer)){

return ;

}

// 絵文字タグを検索する
preg_match_all('/{emoji:([0-9]+)}/', $buffer, $matches);

// 絵文字タグ部分を絵文字に置き換える
if($matches[0] && $matches[1]){

$output = conv_emoji_output($matches,$buffer);

} else {

$output = $buffer;
}

return $output;
}

/**
* 絵文字タグ部分を絵文字に置き換える
*/
function conv_emoji_output($matches,$str){

// 出力データの初期化
$output = "";

// 入力データがない場合は処理終了
if(empty($matches) || !is_array($matches) || empty($str)){

return '';

}

$moji_data = $matches[0];

// 絵文字出力変換データを取得する
$emoji_data = get_emoji_output_data();

foreach($moji_data as $value){

// コロン区切りのデータを配列に入れる
$emoji_num_array = explode(':',str_replace("}", "", $value));

$emoji_num = $emoji_num_array[1];

// キャリアに応じて最適な絵文字を呼び出す
if( is_docomo()){

// DoCoMo
$output = trim($emoji_data[$emoji_num][0]);

}elseif(is_au()){

// au
$output = trim($emoji_data[$emoji_num][1]);

}elseif(is_softbank()){

// Softbank
$output = trim($emoji_data[$emoji_num][2]);

} else {

// PC(DoCoMo)
$output = trim($emoji_data[$emoji_num][0]);

}


// 該当データがない場合はゲタ文字を入れる
if(empty($output)){

$output = "〓";

}
$str = str_replace($value, $output, $str);

}

return $str;

}

/**
* 絵文字変換データを取り出す
*/
function get_emoji_output_data(){

// キャリア絵文字変換表を呼び出す
$handle = fopen("./emoji.csv", "r");

// データを配列に格納する
while(($emoji_data = fgetcsv($handle, 1000, ',')) !== FALSE){

$emoji_all_data_array[$emoji_data[0]] =
array($emoji_data[2],$emoji_data[3],$emoji_data[4]);

}

// ファイルを閉じる
fclose($handle);

return $emoji_all_data_array;

}

header("Content-type: text/html; charset=Shift_JIS");
ob_start("dec_emoji_output");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>ProMobile Friday Blog</title>
</head>
<body>
絵文字のテストです<br />
{emoji:1}<br />
{emoji:2}<br />
{emoji:3}<br />
{emoji:4}<br />
</body>
</html>
<?php
ob_end_flush();
?>

サンプルでは、HTML部分に{emoji:絵文字番号}という形で絵文字タグを入れてい
ます。

出力関数でdec_emoji_output()メソッドを呼び出して、絵文字タグの部分を絵文
字に置き換えて表示します。

最初は絵文字タグがあるかどうかを確認し、ある場合はconv_emoji_output()関
数でCSVから絵文字データを呼び出して、絵文字タグから絵文字番号に相当する
絵文字に変換します。


emoji.csvとemoji_text.phpをサーバーにアップして、DoCoMo、Au、Softbankの
携帯電話でemoji_text.phpにアクセスしてみます。

おお~~っ!!先週に続き、今週も絵文字が表示されました。

絵文字のテストです
?
?
?
?

これまで、絵文字の表示パターンについて説明してきましたが、先週の3のパ
ターンはデザイナーが多く、i絵文字も駆使してデザインとHTMLコーディングだ
けに集中したい場合、4は絵文字の表示だけでなく絵文字掲示板も取り入れたい
場合に使われます。

一昔は、1のようにテンプレートを分ける方法や、2の絵文字配列を使う方法が見
られましたが、最近は絵文字掲示板機能を使うところが増えており、4の方法が
多く見られるようになりました。

絵文字の扱い方もいろいろありますね。

ということで、絵文字の出力についてはこれでおしまいです。

トラックバック(0)

トラックバックURL: http://blog.promob.jp/mt/mt-tb.cgi/340

コメントする