1. ホーム
  2. Blog
  3. Encode::JP::Emoji - emoji4unicode ベースの絵文字変換 Perl モジュール

Encode::JP::Emoji - emoji4unicode ベースの絵文字変換 Perl モジュール

川崎 有亮

川崎 有亮

お知らせ

川崎です

emoji4unicode(Emoji for Unicode)プロジェクトでは、Google が中心となって
日本の携帯各キャリアの絵文字コードを Unicode に登録すべく提案を行っています。
今回、その emoji4unicode の絵文字マッピングテーブルを利用して文字コードの
相互変換を行う Perl モジュール Encode::JP::Emoji を開発しました。

CPAN および Google Code の Project Hosting でソースコードを公開しています。
http://search.cpan.org/dist/Encode-JP-Emoji/
http://code.google.com/p/emoji4unicode-ll/
http://emoji4unicode-ll.googlecode.com/svn/trunk/lang/perl/Encode-JP-Emoji/trunk/

主な特徴

・各キャリアの Shift_JIS 絵文字コードと UTF-8 絵文字コードを相互変換できます。
・emoji4unicode の提供するテーブルにより、各キャリアの絵文字を相互変換できます。
・絵文字が存在しない場合は、fallback によりテキストまたは IMG タグに変換できます。
・日本の 3 キャリアに加えて、Google が内部で利用している絵文字コードにも変換できます。
・emoji4unicode が提案中の PUA を利用しない Unicode との相互変換に対応します。
・pure Perl 実装のため、レンタルサーバ等でも FTP アップロードのみで利用できます。
・pure Perl 実装ですが、実用的な変換処理速度を確保しています。(Encode::JP::Mobile 比)

背景

携帯各キャリアの絵文字は、PUA (Private Use Area) と呼ばれる Unicode の私用領域を
利用して文字コードを割り当てしており、各社の独自仕様となっています。
現在では、キャリアを跨いだメールでも絵文字が使えるようになりましたが、
このときは、送信先の携帯キャリアの絵文字の中から概ね近しい絵文字に自動変換されて、
メールが届いています。実際はキャリアごとに絵文字のバリエーションが異なるため、
完全な相互変換はできません。(一部の絵文字は絵文字として届かない)

emoji4unicode プロジェクトは、その絵文字変換テーブルが元になっています。
この Encode::JP::Emoji モジュールでは、Google の絵文字コードを媒介として、
emoji4unicode プロジェクトのテーブルを利用して各社の絵文字コードを相互変換します。

※ Shift_JIS~UTF-8 の変換テーブルは emoji4unicode プロジェクトに含まれないため、
 川崎が2000年~2005年頃に開発していた 独自実装 をベースにしています。

主な使い方

Encode::JP::Emoji モジュールの簡単な使い方を紹介します。

use Encode::JP::Emoji;

Encode::JP::Emoji モジュールを読み込みます。

my $sun = "\xF8\x9F";
Encode::from_to($sun, 'x-sjis-emoji-docomo', 'utf8');

DoCoMo の Shift_JIS 絵文字コード(SJIS+F89F)を、
DoCoMo の UTF-8 絵文字コード(U+E63E)に変換します。(キャリア内コード変換)

my $scream = "\xF7\xF5";
Encode::from_to($scream, 'x-sjis-e4u-kddiapp', 'x-sjis-e4u-softbank3g');

KDDI の Shift_JIS 絵文字コード(SJIS+F7F5)を、
SoftBank の Shift_JIS 絵文字コード(SJIS+F747)に変換します。(キャリア間相互変換)

my $keycap1 = "\xEE\x9B\xA2";
Encode::from_to($keycap1, 'x-utf8-e4u-docomo', 'utf8');

DoCoMo の UTF-8 絵文字コード(U+E6E2)を、
Google の UTF-8 絵文字コード(U+FE82E)に変換します。

my $newmoon = "\x{FE011}";
my $kddi = Encode::encode('x-sjis-e4u-kddiapp', $newmoon);

Google の UTF-8 絵文字コード(U+FE001、UTF8 フラグ ON)を、
KDDI の Shift_JIS 絵文字コード(SJIS+F7C5)に変換します。

my $clover = "\xF7\x50";
my $softbank = Encode::decode('x-sjis-emoji-softbank3g', $clover);

SoftBank の Shift_JIS 絵文字コード(SJIS+F750)を、
SoftBank の UTF-8 絵文字コード(U+E110、UTF8 フラグ ON)に変換します。

エンコーディング一覧

Encode::JP::Emoji は以下のエンコーディングを提供します。

第1グループ (x-sjis-emoji-***) は、各キャリアが定義している独自 Shift_JIS 絵文字コードと
同 UTF-8 絵文字コードを、相互変換をするエンコーディング群です。
内部文字コード(UTF-8 フラグ ON)では、各キャリアが定義している PUA を使います。

Canonical                   Encoding    Octets Emoji    String Emoji
--------------------------------------------------------------------
x-sjis-emoji-docomo         Shift_JIS   DoCoMo          DoCoMo
x-sjis-emoji-kddiapp        Shift_JIS   KDDI            KDDI(app)
x-sjis-emoji-kddiweb        Shift_JIS   KDDI            KDDI(web)
x-sjis-emoji-softbank2g     Shift_JIS   SoftBank 2G     SoftBank
x-sjis-emoji-softbank3g     Shift_JIS   SoftBank 3G     SoftBank

第2グループ (x-sjis-e4u-*** および x-utf8-e4u-***) では、
各キャリアが定義している独自 Shift_JIS・UTF-8 絵文字コードと、
Google が定義している UTF-8 絵文字コードを、相互変換するエンコーディング群です。
内部文字コード(UTF-8 フラグ ON)では、Google が定義している PUA を使います。
Google の絵文字コードを媒介として、各キャリア間の絵文字相互変換が可能です。

Canonical                   Encoding    Octets Emoji    String Emoji
--------------------------------------------------------------------
x-sjis-e4u-docomo           Shift_JIS   DoCoMo          Google
x-sjis-e4u-kddiapp          Shift_JIS   KDDI(app)       Google
x-sjis-e4u-kddiweb          Shift_JIS   KDDI(web)       Google
x-sjis-e4u-softbank2g       Shift_JIS   SoftBank 2G     Google
x-sjis-e4u-softbank3g       Shift_JIS   SoftBank 3G     Google
x-sjis-e4u-none             Shift_JIS   (No Emoji)      Google
x-utf8-e4u-docomo           UTF-8       DoCoMo          Google
x-utf8-e4u-kddiapp          UTF-8       KDDI(app)       Google
x-utf8-e4u-kddiweb          UTF-8       KDDI(web)       Google
x-utf8-e4u-softbank2g       UTF-8       SoftBank 2G     Google
x-utf8-e4u-softbank3g       UTF-8       SoftBank 3G     Google
x-utf8-e4u-unicode          UTF-8       Unicode Std.    Google
x-utf8-e4u-none             UTF-8       (No Emoji)      (Any PUA)

Canonical は from_to・decode・encode で指定するエンコーディング名、
Encoding は外部文字コード(UTF-8 フラグ OFF=from_to()用)、
Octets Emoji はその際の絵文字の定義、
String Emoji は内部文字コードの絵文字の定義(UTF-8 フラグ ON=decode()後)です。

***-softbank2g は、SoftBank 2G 用エスケープシーケンス形式のみが利用可能です。
***-softbank3g は、SoftBank 3G 用バイナリ形式のみが利用可能です。

x-utf8-e4u-none は特殊で、全ての絵文字を禁止します。
絵文字は全て fallback されるので、FB_XMLCREF や FB_GOOGLE_TEXT で変換して下さい。
PC で絵文字を全く表示しない場合などに利用します。

fallback 関数

x-utf8-e4u-none を使った場合は全ての絵文字で、また、使わない場合でも、
そのエンコーディングが対応しない絵文字コードが存在した場合の対処を、
from_to の第4引数または encode・decode の第3引数で指定できます。

use Encode::JP::Emoji;
use Encode::JP::Emoji::Fallback;

Encode::JP::Emoji::Fallback モジュールを読み込むと、下記のように FB_*** 関数が利用できます。

my $sun = "\xF8\x9F";
Encode::from_to($sun, 'x-sjis-emoji-docomo', 'x-sjis-e4u-none', FB_DOCOMO_TEXT());

DoCoMo の Shift_JIS 絵文字(SJIS+F89F)を DoCoMo 定義の絵文字名「晴れ」に変換します。

my $fog = "\xEE\x96\x98";
Encode::from_to($fog, 'x-utf8-e4u-kddiapp', 'x-utf8-e4u-none', FB_GOOGLE_TEXT());

KDDI の UTF-8 絵文字(U+E598)を Google 定義の絵文字名「霧」に変換します。

my $hamster = "\x{E524}";
my $softbank = Encode::encode('x-sjis-e4u-none', $hamster, FB_SOFTBANK_TEXT());

SoftBank の UTF-8 絵文字(U+E524)を SoftBank 定義の絵文字名「ハムスター」に変換します。

my $bear = "\xF3\xBE\x87\x81";
my $google = Encode::decode('x-utf8-e4u-none', $bear, FB_GOOGLE_TEXT());

Google の UTF-8 絵文字(U+FE1C1)を Google 定義の絵文字名「クマ」に変換します。

その他の fallback 関数については、Encode::JP::Emoji::Fallback のドキュメントを参照して下さい。
なお、独自に fallback 関数を定義する場合は、返り値は UTF-8 フラグ ON で返して下さい。

参考リンク

以下の URL で emoji4unicode の相互変換テーブルを確認できます。

http://emoji4unicode.googlecode.com/svn/trunk/data/emoji4unicode.xml(XML 版)

http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html(HTML 版)

備考

今回、emoji4unicode が提供している XML ファイルを解析する Perl モジュール
Unicode::Emoji::E4U も合わせて開発しました。Encode::JP::Emoji 内部で
変換テーブルを定義している Mapping.pm も、Unicode::Emoji::E4U を使って
生成しています。この Unicode::Emoji::E4U 自体のソースコードも公開しています。
Perl 以外の開発言語に対応したい方もぜひご利用下さい。

[2009/07/04 追記]
KDDI のエンコーディング名を kddi→kddiapp に変更し、非公式のエンコーディング kddiweb を追加しました。
SoftBank のエンコーディング softbank を削除しました。softbank2g・softbank3g をご利用ください。
ドキュメント も参照下さい。

トップへ戻る