root/lang/perl/Encode-JP-Mobile/branches/auto-convert-kddi-front-to-back/lib/Encode/JP/Mobile.pm @ 4835

Revision 4835, 12.7 kB (checked in by chiba, 5 years ago)

add auto-convert kddi-omote to kddi-ura at use x-utf8-*

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