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

Revision 4880, 4.9 kB (checked in by miyagawa, 5 years ago)

KDDI/SoftBank の英語名について、DoCoMoからマッピングしたので同一の英語名が複数の文字に割り当てられるようになった。同一のものについては、コードが若い方を優先するように変更。

Line 
1package Encode::JP::Mobile::Charnames;
2use strict;
3use warnings;
4use charnames ();
5use bytes     ();
6use File::ShareDir 'dist_file';
7use Carp;
8use Encode;
9
10use base qw( Exporter );
11our @EXPORT_OK = qw( unicode2name unicode2name_en vianame );
12
13my $name2unicode;
14my $unicode2name;
15my $unicode2name_en;
16
17sub import {
18    # for perl < 5.10
19    if ($charnames::hint_bits) {
20        $^H |= $charnames::hint_bits;
21    }
22    $^H{charnames} = \&translator;
23    __PACKAGE__->export_to_level(1, @_);
24}
25
26sub translator {
27    if ( $^H & $bytes::hint_bits ) {
28        bytes_translator(@_);
29    }
30    else {
31        unicode_translator(@_);
32    }
33}
34
35my $re = qr/^(DoCoMo|KDDI|SoftBank) (.+)$/io;
36
37sub unicode_translator {
38    my $name = shift;
39
40    if ( my ( $carrier, $r_name ) = ( $name =~ $re ) ) {
41        unless ($name2unicode) {
42            _mk_name2unicode_map();
43        }
44
45        my $ret = $name2unicode->{lc($carrier)}{$r_name};
46        if ( defined $ret ) {
47            return pack "U*", $ret;
48        }
49        else {
50            carp "unknown charnames: $r_name";
51        }
52    }
53    else {
54        return charnames::charnames($name);
55    }
56}
57
58# XXX pictograms are only in the above 0xFF area.
59sub bytes_translator {
60    my $name = shift;
61    return charnames::charnames($name);
62}
63
64sub _mk_name2unicode_map {
65    for my $carrier (qw/docomo kddi softbank/) {
66        my $fname = dist_file( 'Encode-JP-Mobile', "${carrier}-table.pl" );
67        my $dat = do $fname;
68
69        for my $row (@$dat) {
70            next unless exists $row->{name};
71            $name2unicode->{$carrier}{$row->{name}} ||= hex $row->{unicode};
72            if ( exists $row->{name_en} ) {
73                $name2unicode->{$carrier}{$row->{name_en}} ||= hex $row->{unicode};
74            }
75        }
76    }
77}
78
79sub _mk_u2nm {
80    my($key, $map_ref) = @_;
81
82    for my $carrier (qw/docomo kddi softbank/) {
83        my $fname = dist_file( 'Encode-JP-Mobile', "${carrier}-table.pl" );
84        my $dat   = do $fname;
85
86        for my $row (@$dat) {
87            next unless exists $row->{$key};
88            $map_ref->{ hex $row->{unicode} } = decode_utf8($row->{$key});
89            if ($carrier eq 'kddi') {
90                $map_ref->{ hex $row->{unicode_auto} } = decode_utf8($row->{$key});
91            }
92        }
93    }
94}
95
96sub _mk_unicode2name_map    {
97    $unicode2name = {};
98    _mk_u2nm('name', $unicode2name);
99}
100
101sub _mk_unicode2name_en_map {
102    $unicode2name_en = {};
103    _mk_u2nm('name_en', $unicode2name_en);
104}
105
106sub vianame {
107    my $name = shift;
108    croak "missing name" unless $name;
109
110    if ( my ( $carrier, $r_name ) = ( $name =~ $re ) ) {
111        unless ($name2unicode) {
112            _mk_name2unicode_map();
113        }
114
115        return $name2unicode->{lc($carrier)}{$r_name} || carp "unknown charnames: $r_name";
116    }
117    else {
118        return charnames::vianame($name);
119    }
120}
121
122sub unicode2name {
123    my $code = shift;
124    croak "missing code" unless $code;
125
126    unless ($unicode2name) {
127        _mk_unicode2name_map();
128    }
129
130    return $unicode2name->{$code};
131}
132
133sub unicode2name_en {
134    my $code = shift;
135    croak "missing code" unless $code;
136
137    unless ($unicode2name_en) {
138        _mk_unicode2name_en_map();
139    }
140
141    return $unicode2name_en->{$code};
142}
143
1441;
145__END__
146
147=encoding utf-8
148
149=head1 NAME
150
151Encode::JP::Mobile::Charnames - define pictogram names for "\N{named}" string literal escapes
152
153=head1 SYNOPSIS
154
155    use Encode::JP::Mobile::Charnames;
156
157    print "\N{DoCoMo Beer} \N{DoCoMo ファーストフード}\n";
158    Encode::JP::Mobile::Charnames::unicode2name(0xE672);    # => 'ビール'
159    Encode::JP::Mobile::Charnames::unicode2name_en(0xE672); # => 'Beer'
160    Encode::JP::Mobile::Charnames::vianame('DoCoMo Beer');  # => 0xE672
161
162=head1 METHODS
163
164=item unicode2name
165
166    Encode::JP::Mobile::Charnames::unicode2name(0xE672);    # => 'ビール'
167
168unicode から日本語の名前を得ます。
169
170このメソッドは KDDI-cp932 と KDDI-Auto のどちらの Unicode が引数として渡されても名前を返します。
171
172ただし、現在の仕様では、softbank と au の重複領域では softbank が優先されます。
173シェアを考えれば KDDI の方を優先するべきですが、KDDI の方は KDDI-CP932 ではなく
174KDDI-Auto を使うという代替手法があるので、このような仕様となっております。
175
176=item unicode2name_en
177
178    Encode::JP::Mobile::Charnames::unicode2name_en(0xE672); # => 'Beer'
179
180Unicode から英語の名前を得ます。
181
182キャリヤから公式に英語の絵文字名称が付与されているのは docomo だけであるため、KDDI, Softbank については一度  DoCoMo 絵文字にマッピングして得られた文字の名前を利用しています。
183
184=item vianame
185
186    Encode::JP::Mobile::Charnames::vianame('DoCoMo Beer');  # => 0xE672
187
188名前から絵文字の Unicode を得ます
189
190=head1 AUTHOR
191
192Tokuhiro Matsuno <tokuhirom ta mfac ・ jp>
193
194=head1 SEE ALSO
195
196L<Encode::JP::Mobile>, L<charnames>
197
Note: See TracBrowser for help on using the browser.