1=encoding utf-8
2
3=head1 NAME
4
5Encode::JP::Emoji::FB_EMOJI_TEXT - Emoji fallback functions
6
7=head1 SYNOPSIS
8
9    use Encode;
10    use Encode::JP::Emoji;
11    use Encode::JP::Emoji::FB_EMOJI_TEXT;
12
13    # DoCoMo Shift_JIS <SJIS+F95B> octets fallback to "[SOON]"
14    my $soon = "\xF9\x5B";
15    Encode::from_to($soon, 'x-sjis-e4u-docomo', 'x-sjis-e4u-kddiweb', FB_EMOJI_TEXT());
16
17    # KDDI Shift_JIS <SJIS+F7B5> octets fallback to "[霧]"
18    my $fog = "\xF7\xB5";
19    Encode::from_to($fog, 'x-sjis-e4u-kddiweb', 'x-sjis-e4u-softbank3g', FB_EMOJI_TEXT());
20
21    # SoftBank UTF-8 <U+E524> string fallback to "[ハムスター]"
22    my $hamster = "\x{E524}";
23    my $softbank = Encode::encode('x-sjis-e4u-none', $hamster, FB_EMOJI_TEXT());
24
25    # Google UTF-8 <U+FE1C1> octets fallback to "[クマ]"
26    my $bear = "\xF3\xBE\x87\x81";
27    my $google = Encode::decode('x-utf8-e4u-none', $bear, FB_EMOJI_TEXT());
28
29=head1 DESCRIPTION
30
31This module exports the following fallback function.
32
33=head2 FB_EMOJI_TEXT()
34
35This returns emoji character name.
36Having conflicts with SoftBank encoding, KDDI(app) encoding is B<NOT> recommended.
37
38=head1 BUGS
39
40C<Encode.pm> 2.22 or less would face a problem with fallback function.
41Use latest version of C<Encode.pm>, or use with C<EncodeUpdate.pm>
42in C<t> test directory of the package.
43
44=head1 AUTHOR
45
46Yusuke Kawasaki, L<http://www.kawa.net/>
47
48=head1 SEE ALSO
49
50L<Encode::JP::Emoji>
51
52=head1 COPYRIGHT
53
54Copyright 2009-2010 Yusuke Kawasaki, all rights reserved.
55
56=cut
57
58package Encode::JP::Emoji::FB_EMOJI_TEXT;
59use strict;
60use warnings;
61use base 'Exporter';
62use Encode ();
63use Encode::JP::Emoji::Mapping;
64use Encode::JP::Emoji::Property;
65
66our $VERSION = '0.60';
67
68our @EXPORT = qw(
69    FB_EMOJI_TEXT
70);
71
72our $TEXT_FORMAT = '[%s]';
73
74my $ascii  = Encode::find_encoding('us-ascii');
75my $utf8   = Encode::find_encoding('utf8');
76my $stand  = Encode::find_encoding('x-utf8-e4u-unicode');
77my $mixed  = Encode::find_encoding('x-utf8-e4u-mixed');
78my $check  = Encode::FB_XMLCREF();
79
80sub FB_EMOJI_TEXT {
81    my $fb = shift || $check;
82    sub {
83        my $code = shift;
84        my $chr  = chr $code;
85        my $gcode;
86        if ($chr =~ /\p{InEmojiGoogle}/) {
87            # google emoji
88            $gcode = $code;
89        } elsif ($chr =~ /\p{InEmojiUnicode}/) {
90            # unicode emoji
91            my $moct = $utf8->encode(chr $code, $fb);   # Mixed UTF-8 octets
92            my $gstr = $stand->decode($moct, $fb);      # Standard UTF-8 string
93            $gcode = ord $gstr if (1 == length $gstr);
94        } elsif ($chr =~ /\p{InEmojiMixed}/) {
95            # others emoji
96            my $moct = $utf8->encode(chr $code, $fb);   # Mixed UTF-8 octets
97            my $gstr = $mixed->decode($moct, $fb);      # Google UTF-8 string
98            $gcode = ord $gstr if (1 == length $gstr);
99        }
100        my $hex = sprintf '%04X' => $gcode;
101        unless (exists $Encode::JP::Emoji::Mapping::CharnamesEmojiGoogle{$hex}) {
102            my $aoct = $ascii->encode(chr $code, $fb);  # force fallback
103            return $utf8->decode($aoct, $fb);           # UTF-8 string
104        }
105        my $name = $Encode::JP::Emoji::Mapping::CharnamesEmojiGoogle{$hex};
106        sprintf $TEXT_FORMAT => $name;
107    };
108}
109
110# This file was written in UTF-8
111
1121;
113