| 1 | package Encode::JP::Mobile; |
|---|
| 2 | use strict; |
|---|
| 3 | our $VERSION = "0.24"; |
|---|
| 4 | |
|---|
| 5 | use Carp; |
|---|
| 6 | use Encode; |
|---|
| 7 | use XSLoader; |
|---|
| 8 | XSLoader::load(__PACKAGE__, $VERSION); |
|---|
| 9 | |
|---|
| 10 | use base qw( Exporter ); |
|---|
| 11 | our @EXPORT_OK = qw( InDoCoMoPictograms InKDDIPictograms InSoftBankPictograms InAirEdgePictograms InMobileJPPictograms InKDDISoftBankConflicts InKDDICP932Pictograms InKDDIAutoPictograms); |
|---|
| 12 | our %EXPORT_TAGS = ( props => [@EXPORT_OK] ); |
|---|
| 13 | |
|---|
| 14 | use Encode::Alias; |
|---|
| 15 | |
|---|
| 16 | # sjis-raw |
|---|
| 17 | define_alias( 'x-sjis-imode-raw' => 'x-sjis-docomo-raw' ); |
|---|
| 18 | define_alias( 'x-sjis-airedge-raw' => 'x-sjis-airh-raw' ); |
|---|
| 19 | define_alias( 'x-sjis-vodafone-auto-raw' => 'x-sjis-softbank-auto-raw' ); |
|---|
| 20 | |
|---|
| 21 | define_alias( 'x-sjis-kddi' => 'x-sjis-kddi-cp932-raw' ); |
|---|
| 22 | define_alias( 'x-sjis-ezweb' => 'x-sjis-kddi-cp932-raw' ); |
|---|
| 23 | define_alias( 'x-sjis-ezweb-cp932-raw' => 'x-sjis-kddi-cp932-raw' ); |
|---|
| 24 | define_alias( 'x-sjis-ezweb-auto-raw' => 'x-sjis-kddi-auto-raw' ); |
|---|
| 25 | |
|---|
| 26 | # backward compatiblity |
|---|
| 27 | define_alias('shift_jis-kddi' => 'x-sjis-kddi-cp932-raw'); |
|---|
| 28 | |
|---|
| 29 | # utf8 |
|---|
| 30 | define_alias( 'x-utf8-imode' => 'x-utf8-docomo' ); |
|---|
| 31 | define_alias( 'x-utf8-ezweb' => 'x-utf8-kddi' ); |
|---|
| 32 | define_alias( 'x-utf8-vodafone' => 'x-utf8-softbank' ); |
|---|
| 33 | |
|---|
| 34 | use Encode::JP::Mobile::Vodafone; |
|---|
| 35 | use Encode::JP::Mobile::KDDIJIS; |
|---|
| 36 | use Encode::JP::Mobile::ConvertPictogramSJIS; |
|---|
| 37 | require Encode::JP::Mobile::Fallback; |
|---|
| 38 | require Encode::JP::Mobile::Character; |
|---|
| 39 | |
|---|
| 40 | sub InDoCoMoPictograms { |
|---|
| 41 | return <<END; |
|---|
| 42 | E63E\tE6A5 |
|---|
| 43 | E6AC\tE6AE |
|---|
| 44 | E6B1\tE6B3 |
|---|
| 45 | E6B7\tE6BA |
|---|
| 46 | E6CE\tE757 |
|---|
| 47 | END |
|---|
| 48 | } |
|---|
| 49 | |
|---|
| 50 | sub InKDDICP932Pictograms { |
|---|
| 51 | return <<END; |
|---|
| 52 | E468\tE5DF |
|---|
| 53 | EA80\tEB88 |
|---|
| 54 | END |
|---|
| 55 | } |
|---|
| 56 | |
|---|
| 57 | |
|---|
| 58 | sub InKDDIAutoPictograms { |
|---|
| 59 | return <<END; |
|---|
| 60 | EC40\tEC7E |
|---|
| 61 | EC80\tECFC |
|---|
| 62 | ED40\tED7E |
|---|
| 63 | ED80\tED8D |
|---|
| 64 | EF40\tEF7E |
|---|
| 65 | EF80\tEFFC |
|---|
| 66 | F040\tF07E |
|---|
| 67 | F080\tF0FC |
|---|
| 68 | END |
|---|
| 69 | } |
|---|
| 70 | |
|---|
| 71 | sub InKDDIPictograms { |
|---|
| 72 | return join "\n", InKDDICP932Pictograms(), InKDDIAutoPictograms(); |
|---|
| 73 | } |
|---|
| 74 | |
|---|
| 75 | sub InSoftBankPictograms { |
|---|
| 76 | return <<END; |
|---|
| 77 | E001\tE05A |
|---|
| 78 | E101\tE15A |
|---|
| 79 | E201\tE253 |
|---|
| 80 | E255\tE257 |
|---|
| 81 | E301\tE34D |
|---|
| 82 | E401\tE44C |
|---|
| 83 | E501\tE537 |
|---|
| 84 | END |
|---|
| 85 | } |
|---|
| 86 | |
|---|
| 87 | sub InAirEdgePictograms { |
|---|
| 88 | return <<END; |
|---|
| 89 | E000\tE096 |
|---|
| 90 | E098 |
|---|
| 91 | E09A |
|---|
| 92 | E09F |
|---|
| 93 | E0A2 |
|---|
| 94 | E0A6 |
|---|
| 95 | E0A8 |
|---|
| 96 | E0AF |
|---|
| 97 | E0BB |
|---|
| 98 | E0C4 |
|---|
| 99 | E0C9 |
|---|
| 100 | END |
|---|
| 101 | } |
|---|
| 102 | |
|---|
| 103 | sub InMobileJPPictograms { |
|---|
| 104 | # +utf8::InDoCoMoPictograms etc. don't work here |
|---|
| 105 | return join "\n", InDoCoMoPictograms, InKDDIPictograms, InSoftBankPictograms, InAirEdgePictograms; |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | sub InKDDISoftBankConflicts { |
|---|
| 109 | return <<END; |
|---|
| 110 | E501\tE537 |
|---|
| 111 | END |
|---|
| 112 | } |
|---|
| 113 | |
|---|
| 114 | 1; |
|---|
| 115 | __END__ |
|---|
| 116 | |
|---|
| 117 | =encoding utf-8 |
|---|
| 118 | |
|---|
| 119 | =head1 NAME |
|---|
| 120 | |
|---|
| 121 | Encode::JP::Mobile - 日本の携帯電話向け Shift_JIS (CP932) / UTF-8 エンコーディング |
|---|
| 122 | |
|---|
| 123 | =head1 SYNOPSIS |
|---|
| 124 | |
|---|
| 125 | use Encode; |
|---|
| 126 | use Encode::JP::Mobile; |
|---|
| 127 | |
|---|
| 128 | my $bytes = "\x82\xb1\xf9\x5d\xf8\xa0\x82\xb1"; # NTT DoCoMo 絵文字を含んだ Shift_JIS バイト列 |
|---|
| 129 | my $chars = decode("x-sjis-imode", $bytes); # \x{3053}\x{e6b9}\x{e63f}\x{3053} |
|---|
| 130 | |
|---|
| 131 | use Encode::JP::Mobile ':props'; |
|---|
| 132 | if ($chars =~ /\p{InDoCoMoPictograms}/) { |
|---|
| 133 | warn "It has DoCoMo pictogram characters!"; |
|---|
| 134 | } |
|---|
| 135 | |
|---|
| 136 | =head1 DESCRIPTION |
|---|
| 137 | |
|---|
| 138 | Encode::JP::Mobile は Encode 用の拡張モジュールで、日本の携帯電話用絵文字を Unicode の私用領域 (PRIVATE AREA) にマッピングします。 |
|---|
| 139 | |
|---|
| 140 | このモジュールの実装は B<EXPERIMENTAL> です。APIや実装は将来のバージョンで変更される可能性があります。 |
|---|
| 141 | |
|---|
| 142 | =head1 ENCODINGS |
|---|
| 143 | |
|---|
| 144 | このモジュールは以下のエンコーディングをサポートしています。 |
|---|
| 145 | |
|---|
| 146 | =over 4 |
|---|
| 147 | |
|---|
| 148 | =item x-sjis-imode |
|---|
| 149 | |
|---|
| 150 | NTT DoCoMo の i-mode 端末用のマッピング。絵文字は Shift_JIS の私用領域でエンコードされ、Unicode の私用領域にマッピングされます。この際の変換ルールは CP932 と同様です。 |
|---|
| 151 | |
|---|
| 152 | 例えば、C<U+E64E> は I<晴れ> の絵文字で、このエンコーディングでは C<\xF8\X9F> にエンコードされます。 |
|---|
| 153 | |
|---|
| 154 | このエンコーディングは CP932 の完全なサブセットです。現状のバージョンでは、(x-sjis-kddi-autoでdecodeした)KDDI/AU の絵文字および SoftBank の絵文字をマップした Unicode 私用領域からDoCoMo 絵文字へのマッピングもサポートしています。例えば、 |
|---|
| 155 | |
|---|
| 156 | my $kddi = "\xf6\x59"; # KDDI/AU の SJIS で [!] |
|---|
| 157 | my $char = decode("x-sjis-kddi-auto-raw", $bytes); # \x{EF59} |
|---|
| 158 | my $imode = encode("x-sjis-imode", $char); # \xf9\xdc -- DoCoMo の SJIS で [!] |
|---|
| 159 | |
|---|
| 160 | のように相互変換されます。 |
|---|
| 161 | |
|---|
| 162 | I<x-sjis-docomo> をエイリアスとして利用できます。 |
|---|
| 163 | |
|---|
| 164 | =item x-sjis-softbank |
|---|
| 165 | |
|---|
| 166 | SoftBank 絵文字をエンコードするためのエスケープシーケンスがベースの Shift_JIS エンコーディングです。エンコード・デコードのアルゴリズムは UCM ファイルではなく、Perl コードで実装されています。 |
|---|
| 167 | |
|---|
| 168 | I<x-sjis-vodafone> をエイリアスとして利用できます。 |
|---|
| 169 | |
|---|
| 170 | 例えば、C<U+E001> は I<男の子> の絵文字で、このエンコーディングでは C<\x1b$G!\x0f> のようにエンコードされます。(C<\x1b> がエスケープシーケンス開始、C<\x0f> が終了を示す) |
|---|
| 171 | |
|---|
| 172 | DoCoMo および (x-sjis-kddi-autoでdecodeした)KDDI/AU の絵文字は適切な SoftBank 絵文字にマッピングされます。 |
|---|
| 173 | |
|---|
| 174 | =item x-sjis-softbank-auto |
|---|
| 175 | |
|---|
| 176 | Unicode 私用領域にマップされた SoftBank 絵文字と Shift_JIS 私用領域(外字)をマッピングします。このエンコーディングは 3GC 端末を利用して Shift_JIS でエンコードされた Web フォームに絵文字を入力し、サブミットしたときに送信されるエンコードです。実機端末では HTML 内にこのエンコーディングでエンコードした絵文字をデコードして表示できることが確認されています。 |
|---|
| 177 | |
|---|
| 178 | I<x-sjis-vodafone-auto> をエイリアスとして利用できます。 |
|---|
| 179 | |
|---|
| 180 | Shift_JIS 私用領域のマッピングは CP932 に似ていますが、若干ずれている場所があります。 |
|---|
| 181 | |
|---|
| 182 | 例えば、 C<U+E001> は I<男の子> 絵文字 (I<x-sjis-softbank> と同様) で、このエンコーディングでは I<\xF9\x41> とエンコードされます。 |
|---|
| 183 | |
|---|
| 184 | DoCoMo および KDDI/AU の絵文字は適切な SoftBank 絵文字にマッピングされます。 |
|---|
| 185 | |
|---|
| 186 | =item x-sjis-kddi-cp932-raw |
|---|
| 187 | |
|---|
| 188 | KDDI/AU 絵文字のマッピング。(おそらく)CP932 をベースにしていますが、CP932.TXT には含まれない私用領域文字を多く含んでいます。 |
|---|
| 189 | |
|---|
| 190 | 例えば、I<U+E481> は I<!> (ビックリマーク)絵文字で、このエンコーディングでは I<\xF6\x59> のようにエンコードされ、これは CP932 と同様です。 I<U+EB88> は I<怒る> 絵文字で、I<\xF4\x8D> のようにエンコードされますが、CP932 はこの文字に対するマッピングを含んでいません。 |
|---|
| 191 | |
|---|
| 192 | このエンコーディングに含まれる一部の絵文字は、SoftBank の私用領域と重複しています。 |
|---|
| 193 | |
|---|
| 194 | このエンコーディングでは、絵文字の相互変換がおこなわれないことに注意してください。これは、KDDI-CP932 の Unicode の領域が SoftBank の絵文字領域と重複しているため、ただしく相互変換することができないためです。絵文字相互変換機能を利用したい場合には x-sjis-kddi-auto を使用してください。 |
|---|
| 195 | |
|---|
| 196 | I<x-sjis-ezweb> をエイリアスとして利用できます。 |
|---|
| 197 | |
|---|
| 198 | =item x-sjis-kddi-auto |
|---|
| 199 | |
|---|
| 200 | KDDI/AU 絵文字のマッピングで、端末内部の Shift_JIS - UTF-8 間の変換表を元にしています。 |
|---|
| 201 | |
|---|
| 202 | KDDI端末から、UTF-8 ページ内の Web フォームに絵文字を入力して送信した場合、x-sjis-kddi でマップされる Unicode 私用領域 (CP932 ベース) とは異なる領域(通称 裏KDDI Unicode)が利用されます。x-sjis-kddi-auto は、この領域と、KDDI 端末の Shift_JIS 外字バイト列とをマッピングしたものです。 |
|---|
| 203 | |
|---|
| 204 | 現状のバージョンでは、DoCoMo の絵文字をマップした Unicode 私用領域から KDDI/AU 絵文字、SoftBank 絵文字へのマッピングもサポートしています。 |
|---|
| 205 | |
|---|
| 206 | C<x-sjis-ezweb-auto> をエイリアスとして利用できます。 |
|---|
| 207 | |
|---|
| 208 | =item x-iso-2022-jp-kddi |
|---|
| 209 | |
|---|
| 210 | KDDI/AU の絵文字を Email 内で利用する際のエンコーディング。日本語でメールを送信する際、依然としてデファクトスタンダードである I<iso-2022-jp> をベースにしています。 |
|---|
| 211 | |
|---|
| 212 | 実際には、ほとんどの KDDI/AU 携帯電話端末は Shift_JIS でエンコードされた Email を受信することができるため、I<x-sjis-kddi> (または -auto)を利用してメールを送信すれば問題はないでしょう。このエンコーディングは携帯端末から送られた絵文字を含むメールを受信し、デコードする際に必要になります。 |
|---|
| 213 | |
|---|
| 214 | C<x-iso-2022-jp-ezweb> をエイリアスとして利用できます。 |
|---|
| 215 | |
|---|
| 216 | =item x-iso-2022-jp-kddi-auto |
|---|
| 217 | |
|---|
| 218 | I<x-iso-2022-jp-kddi> と同様ですが、絵文字を KDDI-Auto の Unicode 領域にデコードします。 |
|---|
| 219 | |
|---|
| 220 | =item x-sjis-airedge |
|---|
| 221 | |
|---|
| 222 | AirEDGE の絵文字をマッピングします。cp932 の完全なサブセットで、I<x-sjis-airh> をエイリアスとして利用できます。 |
|---|
| 223 | |
|---|
| 224 | AirEDGE 独自の文字コードでは、絵文字は E000 - E0C9 にマップされ、CP932 と同様のエンコーディングですが、実際にはこのエンコーディングを利用することはまずないと思われます。AirEDGE 端末から「ウェブ用絵文字」を利用して送信したデータは、DoCoMo 用絵文字と同様のエンコーディングで送信され、CP932 互換のマッピングで DoCoMo 用絵文字のコードポイントにマッピングされます。また、AirEDGE 独自の絵文字私用領域は SoftBank の私用領域とも重複しており、相互変換の上でも問題があります。 |
|---|
| 225 | |
|---|
| 226 | I<x-sjis-airedge> は I<x-sjis-docomo> の別名、として考えておくとよいでしょう。 |
|---|
| 227 | |
|---|
| 228 | SoftBank および KDDI/AU の絵文字は適切な DoCoMo 絵文字(ウェブ入力用絵文字)にマッピングされます。 |
|---|
| 229 | |
|---|
| 230 | =item x-utf8-docomo, x-utf8-softbank, x-utf8-kddi |
|---|
| 231 | |
|---|
| 232 | これらのエンコーディングは、Unicode 私用領域にある各キャリアの絵文字を相互変換しながら UTF-8 互換のエンコーディングにエンコードするのに使用します。utf-8 という名前がついていますが、実際にはすべての Unicode 文字をエンコードするわけではなく、サブセットとして、 |
|---|
| 233 | |
|---|
| 234 | cp932 + x-sjis-{キャリア} + (他キャリアからのマッピング) |
|---|
| 235 | |
|---|
| 236 | に含まれる文字セットをエンコードし、他キャリアの分は自動で自キャリアの対応する絵文字に変換します。 |
|---|
| 237 | |
|---|
| 238 | 例えば、 |
|---|
| 239 | |
|---|
| 240 | # UTF-8 で KDDI の "晴れ" 絵文字 |
|---|
| 241 | my $bytes = "\xEE\xBD\xA0"; |
|---|
| 242 | Encode::from_to($bytes, "utf-8" => "x-utf8-docomo"); |
|---|
| 243 | # $bytes は DoCoMo の "晴れ" 絵文字を UTF-8 でエンコードしたもの |
|---|
| 244 | |
|---|
| 245 | これらのエンコードは基本的にラウンドトリップ可能ですが、UTF-8のサブセットであるため、CP932 および携帯絵文字以外の文字をエンコード・デコードすることはできません。また、各キャリア間で変換不可能な文字についても対応するマッピングが存在しない場合がありますので、L<Encode::JP::Mobile::FB_CHARACTER> や カスタムコールバックなどを利用して代替文字を表示する必要があります。 |
|---|
| 246 | |
|---|
| 247 | I<x-utf8-airh>, I<x-utf8-airedge> は存在しません。Willcom 端末は utf8 でページを表示している場合には絵文字の表示ができないようです。詳しくは L<http://mobilehacker.g.hatena.ne.jp/tokuhirom/20080118/1200637282> を参照。Willcom 端末で絵文字を表示させたい場合には I<x-sjis-airh>, I<x-sjis-airedge> をご利用ください。 |
|---|
| 248 | |
|---|
| 249 | =item x-sjis-docomo-raw, x-sjis-softbank-raw, x-sjis-softbank-auto-raw, x-sjis-kddi-cp932-raw, x-sjis-kddi-auto-raw, x-sjis-airh-raw |
|---|
| 250 | |
|---|
| 251 | x-sjis-* のエンコーディングには -raw suffix がついたバージョンのエンコーディングも用意されています。 |
|---|
| 252 | |
|---|
| 253 | これは、FALLBACK によって文字コードを判定するような用途を想定しています。 |
|---|
| 254 | |
|---|
| 255 | x-utf8-*-raw が用意されていないのは、utf-8 エンコーディングがそれにあたるからです。 |
|---|
| 256 | |
|---|
| 257 | =back |
|---|
| 258 | |
|---|
| 259 | =head1 UNICODE PROPERTIES |
|---|
| 260 | |
|---|
| 261 | モジュールを ':props' フラグつきで import すると、以下のUnicode プロパティが利用できるようになります。 |
|---|
| 262 | |
|---|
| 263 | =over 4 |
|---|
| 264 | |
|---|
| 265 | =item * InMobileJPPictograms |
|---|
| 266 | |
|---|
| 267 | Encode::JP::Mobile であつかうすべての絵文字にマッチします。 |
|---|
| 268 | |
|---|
| 269 | =item * InDoCoMoPictograms |
|---|
| 270 | |
|---|
| 271 | =item * InKDDIPictograms |
|---|
| 272 | |
|---|
| 273 | =item * InSoftBankPictograms |
|---|
| 274 | |
|---|
| 275 | =item * InAirEdgePictograms |
|---|
| 276 | |
|---|
| 277 | これらはそれぞれそのキャリアの表示できる絵文字にマッチします。 |
|---|
| 278 | |
|---|
| 279 | =item * InKDDICP932Pictograms |
|---|
| 280 | |
|---|
| 281 | =item * InKDDIAutoPictograms |
|---|
| 282 | |
|---|
| 283 | I<InKDDICP932Pictograms>, I<InKDDIAutoPictograms> はそれぞれ、I<x-sjis-kddi>, I<x-sjis-kddi-auto> のマッピングによって得られる Unicode 私用領域のレンジをあらわし、I<InKDDIPictograms> はその双方を含みます。 |
|---|
| 284 | |
|---|
| 285 | =item * InKDDISoftBankConflicts |
|---|
| 286 | |
|---|
| 287 | SoftBank と KDDI (x-sjis-kddi を利用した場合) の Unicode 私用領域の重複する文字列を含んでいます。 |
|---|
| 288 | |
|---|
| 289 | =back |
|---|
| 290 | |
|---|
| 291 | =head1 BACKWARD COMPATIBLITY |
|---|
| 292 | |
|---|
| 293 | バージョン 0.07 から、モジュールで利用するエンコーディング名を I<x-sjis-*> のように変更しました。以前の I<shift_jis-*> というエイリアスも残してありますが、将来のリリースで削除される予定です。 |
|---|
| 294 | |
|---|
| 295 | バージョン 0.25 から、x-sjis-kddi-cp932-raw(旧称 x-sjis-kddi)は DoCoMo との絵文字相互変換をおこなわなくなりました。 |
|---|
| 296 | |
|---|
| 297 | =head1 AUTHORS |
|---|
| 298 | |
|---|
| 299 | Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt> with contributions from: |
|---|
| 300 | |
|---|
| 301 | Tokuhiro Matsuno |
|---|
| 302 | |
|---|
| 303 | Naoki Tomita |
|---|
| 304 | |
|---|
| 305 | Masahiro Chiba |
|---|
| 306 | |
|---|
| 307 | =head1 LICENSE |
|---|
| 308 | |
|---|
| 309 | This library is free software, licensed under the same terms with Perl. |
|---|
| 310 | |
|---|
| 311 | =head1 SEE ALSO |
|---|
| 312 | |
|---|
| 313 | L<Encode>, L<HTML::Entities::ImodePictogram>, L<Unicode::Japanese> |
|---|
| 314 | |
|---|
| 315 | L<http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/> |
|---|
| 316 | L<http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/extention/> |
|---|
| 317 | L<http://www.au.kddi.com/ezfactory/tec/spec/3.html> |
|---|
| 318 | L<http://developers.softbankmobile.co.jp/dp/tool_dl/web/picword_top.php> |
|---|
| 319 | L<http://www.willcom-inc.com/ja/service/contents_service/club_air_edge/for_phone/homepage/index.html> |
|---|
| 320 | L<http://www.nttdocomo.co.jp/service/mail/imode_mail/emoji_convert/> |
|---|
| 321 | L<http://www.nttdocomo.co.jp/binary/pdf/service/mail/imode_mail/emoji_convert/pictogram.pdf> |
|---|
| 322 | L<http://broadband.mb.softbank.jp/service/3G/mail/pictogram/convert.pdf> |
|---|
| 323 | |
|---|
| 324 | =cut |
|---|