携帯端末から送信された絵文字入りテキストをデータベースに保存するメモ。
CakePHP(1.2.1.8004)を使います。
docomo、SoftBankの端末から絵文字が含まれたテキストを投稿し、それを保存してみます。
Index
すること、しないこと
- 前回までのように、HTMLの文字コードはutf-8とします。
- 携帯端末(docomo、SoftBank)から送信された、絵文字が含まれたテキストをデータベースに保存します。
保存したデータが携帯端末(docomo、SoftBank)で表示されることを確認します。 - au端末での動作確認は行いません(いま行えません)。
設定
設定は、CakePHPで携帯サイトを作る - 絵文字出力と同じです。
テーブル作成
CakePHPで携帯サイトを作る - ログインページ(1)で作成したデータベースにテーブルを追加します。
-
CREATE TABLE `t_simple_msgs` (
-
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-
`user_id` int(10) UNSIGNED NOT NULL,
-
`msg` varchar(1000) NOT NULL,
-
`created` datetime NOT NULL,
-
`modified` datetime NOT NULL,
-
PRIMARY KEY (`id`)
-
)
t_simple_msgsテーブルは、ログインしたユーザーが投稿したテキストを保存するテーブルです。
絵文字コード定義
絵文字コードは、CakePHPで携帯サイトを作る - 絵文字出力と同様です。
モデル・コントローラー・ビューの作成
t_simple_msgsテーブルを作成後、bakeツールを使って、t_simple_msgsテーブルに関連するモデル・コントローラー・ビューを作成しました。
作成されたコントローラーとビューには、主に次のような変更をしました。
- ログインしないと投稿できない。
- 投稿した本人以外変更できないようにする。
- データをデータベースに保存するときに、絵文字を絵文字コードに変更する。
絵文字をデータベースへ保存
携帯端末から送信された絵文字を絵文字コードに変換して、データベースに保存します。
新規にテキストを登録する場合、次のようにしてみました。
-
class SimpleMsgsController extends AppController
-
{
-
// ...略
-
-
function add()
-
{
-
if (!$this->isLogin()) {
-
$this->redirectPage($this->webroot . 'login');
-
return;
-
}
-
$this->checkLoginMobileId();
-
-
$this->data['SimpleMsg']['msg'] = convert_to_emoji_code($this->data['SimpleMsg']['msg']);
-
-
$this->data['SimpleMsg']['user_id'] = $this->getLoginUserId();
-
$this->SimpleMsg->create();
-
if ($this->SimpleMsg->save($this->data)) {
-
$this->Session->setFlash(__('The SimpleMsg has been saved', true));
-
$this->redirectPage($this->webroot . 'simpleMsgs/index');
-
}
-
else {
-
$this->Session->setFlash(__('The SimpleMsg could not be saved. Please, try again.', true));
-
}
-
}
-
$users = $this->SimpleMsg->User->find('list');
-
}
-
// ...略
convert_to_emoji_code()関数で、絵文字を絵文字コード変換します。
-
/**
-
* 入力文字列内の絵文字を絵文字コード([[emjI:1]]など)に変換する。
-
*/
-
function convert_to_emoji_code(&$string)
-
{
-
if (!IS_MOBILE) {
-
return $string;
-
}
-
else {
-
include_once('Zend/Json.php');
-
$conv_str = null;
-
if (UAGENT_KIND == UAGENT_DOCOMO) {
-
$carrier = 'docomo';
-
}
-
else if (UAGENT_KIND == UAGENT_AU) {
-
$carrier = 'ezweb';
-
}
-
else if (UAGENT_KIND == UAGENT_SB) {
-
$carrier = 'softbank';
-
}
-
else {
-
return $string;
-
}
-
if (make_utf8_map($carrier,$map)) {
-
if ($conv_str) {
-
conv_emoji4db($conv_str,$map,UAGENT_KIND,$result);
-
}
-
else {
-
conv_emoji4db($string,$map,UAGENT_KIND,$result);
-
}
-
return $result;
-
}
-
return $string;
-
}
-
}
-
-
function conv_emoji4db(&$string,&$map,$uagent_kind,&$result)
-
{
-
$result = '';
-
-
$type_str = 'I';
-
if ($uagent_kind == UAGENT_AU) {
-
$type_str = 'E';
-
}
-
else if ($uagent_kind == UAGENT_SB) {
-
$type_str = 'S';
-
}
-
-
for ($i=1;$i<=$count;$i++) {
-
$check_str = null;
-
}
-
$result .= '[[emj' . $type_str . ':' . $map[$check_str] .']]';
-
$i += 2;
-
}
-
else {
-
}
-
}
-
return true;
-
}
-
-
/**
-
* 絵文字のutf-8コードと絵文字番号の対応表を作成する。
-
*/
-
function make_utf8_map($carrier,&$map)
-
{
-
$path = PICTOGRAM_JSON_DIR . '/' . $carrier .'_emoji.json';
-
return false;
-
}
-
if ($data === false) {
-
return false;
-
}
-
$emoji = Zend_Json::decode($data);
-
$arr =& $emoji[$carrier];
-
foreach ($arr as $e) {
-
}
-
return true;
-
}
表示サンプル
docomoとSoftBankの実機から絵文字入りテキストを投稿してみました。
iモードHTMLシミュレータⅡでは、次のように表示されます。

docomo端末では、softbank端末から投稿した絵文字の一部がダミーテキストとして表示されています。
softbankの絵文字に対応するdocomoの絵文字がないと、そうなります。
softbankのシミュレータ(ウェブコンテンツビューアー)では、次のように表示されます。

動作について
docomoとSoftBankの実機で、絵文字の保存・表示を確認しました。
最近の端末であっても、utf-8のHTMLを表示できる端末であっても、動作しないものがあると思います(なんとなく)。
au端末では絵文字の表示も投稿もできないかもしれません。
いま僕はauの実機をもっていないので、他キャリアで投稿された絵文字が表示されるのか、絵文字を入力して投稿できるのか確認できないのです。
auのシミュレータ(Openwave SDK 6.2)では、<img localsrc="番号">で絵文字を出力する場合、絵文字が表示されます。
その方法を止めたので、シミュレータ(Openwave SDK 6.2)でも、絵文字は表示されていません。
ダウンロード
ダウンロードページへのリンクです。
リンク(au絵文字)
- auの絵文字の文字コードまとめ - clouderの日記 - モバイルハッカー連絡会
- KDDI/AUでutf-8のHTMLフォームから送られてくる絵文字コード - Bulknews::Subtech - subtech
- ケータイ飲食検索、au・ソフトバンク端末に対応|blog|たたみラボ
[...] CakePHPで携帯サイトを作る – 絵文字入力 « trekdevel [...]