root/lang/perl/Encode-JP-Mobile/trunk/lib/Encode/JP/Mobile.pm @ 16183

Revision 16183, 15.3 kB (checked in by tomi-ru, 6 years ago)

TODO update

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