NAME
Encode::JP::Mobile - 日本の携帯電話向け Shift_JIS (CP932) / UTF-8 エンコーディング
SYNOPSIS
use Encode;
use Encode::JP::Mobile;
my $bytes = "\x82\xb1\xf9\x5d\xf8\xa0\x82\xb1"; # NTT DoCoMo 絵文字を含んだ Shift_JIS バイト列
my $chars = decode("x-sjis-imode", $bytes); # \x{3053}\x{e6b9}\x{e63f}\x{3053}
use Encode::JP::Mobile ':props';
if ($chars =~ /\p{InDoCoMoPictograms}/) {
warn "It has DoCoMo pictogram characters!";
}
DESCRIPTION
Encode::JP::Mobile は Encode 用の拡張モジュールで、日本の携帯電話用絵文字を Unicode の私的利用領域 (PRIVATE AREA) にマッピングします。
このモジュールの実装は EXPERIMENTAL です。APIや実装は将来のバージョンで変更される可能性があります。
ENCODINGS
このモジュールは以下のエンコーディングをサポートしています。
- x-sjis-imode
-
NTT DoCoMo の i-mode 端末用のマッピング。絵文字は Shift_JIS の私的利用領域でエンコードされ、Unicode の私的利用領域にマッピングされます。この際の変換ルールは CP932 と同様です。
例えば、
U+E64E
は 晴れ の絵文字で、このエンコーディングでは\xF8\X9F
にエンコードされます。このエンコーディングは CP932 の完全なサブセットですが、KDDI/AU の絵文字をマップした Unicode 私的利用領域からDoCoMo 絵文字へのマッピングもサポートしています。例えば、
my $kddi = "\xf6\x59"; # KDDI/AU の SJIS で [!] my $char = decode("x-sjis-kddi", $bytes); # \x{E481} my $imode = encode("x-sjis-imode", $char); # \xf9\xdc -- DoCoMo の SJIS で [!]
x-sjis-docomo をエイリアスとして利用できます。
- x-sjis-softbank
-
SoftBank 絵文字をエンコードするためのエスケープシーケンスがベースの Shift_JIS エンコーディングです。エンコード・デコードのアルゴリズムは UCM ファイルではなく、Perl コードで実装されています。
x-sjis-vodafone をエイリアスとして利用できます。
例えば、
U+E001
は 男の子 の絵文字で、このエンコーディングでは\x1b$G!\x0f
のようにエンコードされます。(\x1b$G
がエスケープシーケンス開始、\x0f
が終了を示す) - x-sjis-softbank-auto
-
Unicode 私的利用領域にマップされた SoftBank 絵文字と Shift_JIS 私的利用領域(外字)をマッピングします。このエンコーディングは 3GC 端末を利用して Shift_JIS でエンコードされた Web フォームに絵文字を入力し、サブミットしたときに送信されるエンコードです。実機端末では HTML 内にこのエンコーディングでエンコードした絵文字をデコードして表示できることが確認されています。
x-sjis-vodafone-auto をエイリアスとして利用できます。
Shift_JIS 私的利用領域のマッピングは CP932 に似ていますが、若干ずれている場所があります。
例えば、 +E001 は 男の子 絵文字 (x-sjis-softbank と同様) で、このエンコーディングでは \xF9\x41 とエンコードされます。
- x-sjis-kddi
-
KDDI/AU 絵文字のマッピング。(おそらく)CP932 をベースにしていますが、CP932.TXT には含まれない私的利用領域文字を多く含んでいます。
例えば、U+E481 は ! (ビックリマーク)絵文字で、このエンコーディングでは \xF6\x59 のようにエンコードされ、これは CP932 と同様です。 U+EB88 は 怒る 絵文字で、\xF4\x8D のようにエンコードされますが、CP932 はこの文字に対するマッピングを含んでいません。
このエンコーディングに含まれる一部の絵文字は、SoftBank の私的利用領域と重複しています。
x-sjis-ezweb をエイリアスとして利用できます。
- x-sjis-kddi-auto
-
KDDI/AU 絵文字のマッピングで、端末内部の Shift_JIS - UTF-8 間の変換表を元にしています。
KDDI端末から、UTF-8 ページ内の Web フォームに絵文字を入力して送信した場合、x-sjis-kddi でマップされる Unicode 私的利用領域 (CP932 ベース) とは異なる領域(通称 裏KDDI Unicode)が利用されます。x-sjis-kddi-auto は、この領域と、KDDI 端末の Shift_JIS 外字バイト列とをマッピングしたものです。
x-sjis-kddi-auto と x-sjis-kddi は Unicode 外字領域のコードポイントを相互に共有しているため、ラウンドトリップすることが可能です。つまり、
my $bytes = "\xf6\x59"; # [!] in KDDI/AU decode("x-sjis-kddi", $bytes); # \x{E481} -- CP932 ベースのマッピング decode("x-sjis-kddi-auto", $bytes); # \x{EF59} -- UTF-8 端末変換と同様のマッピング encode("x-sjis-kddi", "\x{EF59}"); # $bytes と同じ encode("x-sjis-kddi-auto", "\x{E481}"); # $bytes と同じ
このようにエンコードする際は、どちらを利用しても同じ結果が得られるため、UTF-8 端末からの入力をそのままデータベースに保存するようなケースでは x-sjis-kddi-auto を利用するとよいでしょう。x-sjis-kddi とは異なり、このエンコーディングに含まれる絵文字は、SoftBank の私的利用領域と重複しません。
x-sjis-ezweb-auto
をエイリアスとして利用できます。 - x-iso-2022-jp-kddi
-
KDDI/AU の絵文字を Email 内で利用する際のエンコーディング。日本語でメールを送信する際、依然としてデファクトスタンダードである iso-2022-jp をベースにしています。
実際には、ほとんどの KDDI/AU 携帯電話端末は Shift_JIS でエンコードされた Email を受信することができるため、x-sjis-kddi (または -auto)を利用してメールを送信すれば問題はないでしょう。このエンコーディングは携帯端末から送られた絵文字を含むメールを受信し、デコードする際に必要になります。
x-iso-2022-jp-ezweb
をエイリアスとして利用できます。 - x-iso-2022-jp-kddi-auto
-
x-iso-2022-jp-kddi と同様ですが、絵文字を 裏KDDI Unicode 領域にデコードします。
- x-sjis-airedge
-
AirEDGE の絵文字をマッピングします。cp932 の完全なサブセットで、x-sjis-airh をエイリアスとして利用できます。
AirEDGE 独自の文字コードでは、絵文字は E000 - E0C9 にマップされ、CP932 と同様のエンコーディングですが、実際にはこのエンコーディングを利用することはまずないと思われます。AirEDGE 端末から「ウェブ用絵文字」を利用して送信したデータは、DoCoMo 用絵文字と同様のエンコーディングで送信され、CP932 互換のマッピングで DoCoMo 用絵文字のコードポイントにマッピングされます。また、AirEDGE 独自の絵文字私用領域は SoftBank の私用領域とも重複しており、相互変換の上でも問題があります。
x-sjis-airedge は x-sjis-docomo の別名、として考えておくとよいでしょう。
- x-utf8-docomo, x-utf8-softbank, x-utf8-kddi, x-utf8-airh
-
これらのエンコーディングは、Unicode 私的利用領域にある各キャリアの絵文字を相互変換しながら UTF-8 互換のエンコーディングにエンコードするのに使用します。utf-8 という名前がついていますが、実際にはすべての Unicode 文字をエンコードするわけではなく、サブセットとして、
cp932 + x-sjis-{キャリア} + (他キャリアからのマッピング)
に含まれる文字セットをエンコードし、他キャリアの分は自動で自キャリアの対応する絵文字に変換します。
例えば、
# UTF-8 で KDDI の "晴れ" 絵文字 my $bytes = "\xEE\xBD\xA0"; Encode::from_to($bytes, "utf-8" => "x-utf8-docomo"); # $bytes は DoCoMo の "晴れ" 絵文字を UTF-8 でエンコードしたもの
これらのエンコードは基本的にラウンドトリップ可能ですが、UTF-8のサブセットであるため、CP932 および携帯絵文字以外の文字をエンコード・デコードすることはできません。また、各キャリア間で変換不可能な文字についても対応するマッピングが存在しない場合がありますので、
FB_XMLCREF
などの fallback や、カスタムコールバックなどを利用して代替文字を表示する必要があります。詳しくは http://mobilehacker.g.hatena.ne.jp/tokuhirom/20080116/1200501202 や http://mobilehacker.g.hatena.ne.jp/tomi-ru/20071116/1195186373 などを参照。
x-utf8-airh, x-utf8-airedge については、x-utf8-docomo のエイリアスとして定義されています。上述のとおり、AirEDGE 独自の絵文字私用領域は SoftBank と重複しており、また実用上そのデータが端末から送信されることはまれです。AirEDGE 端末については、DoCoMo 端末と同様のエンコーディングを利用するものという前提で、このような実装になっています。
UNICODE PROPERTIES
モジュールを ':props' フラグつきで import すると、以下のUnicode プロパティが利用できるようになります。
- InDoCoMoPictograms
- InKDDIPictograms
- InSoftBankPictograms
- InAirEdgePictograms
- InKDDISoftBankConflicts
InKDDIPictograms はCP932ベースと裏KDDI Unicodeの双方を含みます。
入力が Shift_JIS である場合、まずどの x-sjis-* に対応するかを判別した上でデコードし、Unicode コードポイントを得たあとでないとキャリアを見分けることができません。よって入力が UTF-8 である場合や、いったん x-sjis-* を利用してデコードしたものに対して使うと便利でしょう。
InKDDISoftBankConflicts は SoftBank と KDDI (x-sjis-kddi を利用した場合) の Unicode 私用領域の重複する文字列を含んでいます。以下のようなコードで、元々の絵文字が KDDI のものであったか、SoftBank のものであったか判定することが可能です(文字列に含まれる絵文字が重複部分のみの場合、判定することはできません)。
my $string = ...;
if ($string =~ /\p{InKDDISoftBankConflicts}/) {
eval { Encode::encode("x-sjis-kddi", $string, Encode::FB_CROAK) };
if ($@) {
# softbank
} else {
# KDDI
}
}
BACKWARD COMPATIBLITY
バージョン 0.07 から、モジュールで利用するエンコーディング名を x-sjis-* のように変更しました。以前の shift_jis-* というエイリアスも残してありますが、将来のリリースで削除される予定です。
AUTHORS
Tatsuhiko Miyagawa <miyagawa@bulknews.net> with contributions from:
Tokuhiro Matsuno
Naoki Tomita
Masahiro Chiba
LICENSE
This library is free software, licensed under the same terms with Perl.
SEE ALSO
Encode, HTML::Entities::ImodePictogram, Unicode::Japanese
http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/ http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/extention/ http://www.au.kddi.com/ezfactory/tec/spec/3.html http://developers.softbankmobile.co.jp/dp/tool_dl/web/picword_top.php http://www.willcom-inc.com/ja/service/contents_service/club_air_edge/for_phone/homepage/index.html http://www.nttdocomo.co.jp/service/mail/imode_mail/emoji_convert/
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 168:
Deleting unknown formatting code U<>