Encode-JP-Mobile

 view release on metacpan or  search on metacpan

lib/Encode/JP/Mobile/Cookbook.pod  view on Meta::CPAN

  
  my $agent = HTTP::MobileAgent->new;
  my $encoding = detect_encoding($agent);
  
  sub detect_encoding {
      my $agent = shift;
      if ($agent->is_docomo) {
          return $agent->xhtml_compliant ? 'x-utf8-docomo' : 'x-sjis-docomo';
      } elsif ($agent->is_ezweb) {
          return 'x-sjis-kddi-auto';
      } elsif ($agent->is_vodafone) {
         return $agent->is_type_3gc ? 'x-utf8-softbank' : 'x-sjis-softbank';
      } elsif ($agent->is_airh_phone) {
          return 'x-sjis-airh';
      } else { # $agent->is_non_mobile には utf-8 とします
          return 'utf-8';
      }
  }

=head2 さらに楽をする

この例の C<detect_encoding()> サブルーチンを毎回コピーする必要はありません。これは L<HTTP::MobileAgent::Plugin::Charset> というモジュールとしてパッケージ化されています。これを利用すると、...

  use HTTP::MobileAgent;
  use HTTP::MobileAgent::Plugin::Charset;
  
  my $agent = HTTP::MobileAgent->new;
  my $encoding = $agent->encoding; # これだけ!

=head2 利用イメージ

上記をふまえ、キャリア間で decode/encode するイメージをつかむため、簡略化した CGI スクリプトを示します。

  use CGI;
  use HTTP::MobileAgent;
  use HTTP::MobileAgent::Plugin::Charset;
  use Encode;
  use Encode::JP::Mobile;
  
  my $cgi = CGI->new;
  my $agent = HTTP::MobileAgent->new;
  my $encoding = $agent->encoding;
  
  if ($cgi->request_method eq 'POST') {
      # 端末からの入力は端末に合わせたエンコーディングで decode し任意の処理を行い...
      my $data = decode($encoding, $cgi->param('text'));
      
      # DB などへは utf-8 で保存.
      open(my $fh, '>>', '/tmp/test.txt');
      print {$fh} encode('utf-8', $data);
      close $fh;
  }
  
  # DB などからは普通に utf-8 で取り出し任意の処理を行い...
  open(my $fh, '<', '/tmp/test.txt');
  my $data = decode('utf-8', join "", <$fh>);
  
  # 出力する時は、端末に合わせたエンコーディングで encode してやります.
  my $charset = $encoding =~ /sjis/ ? 'shift_jis' : 'utf-8';
  my $html = <<HTML
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=$charset" />
  </head>
  <body>
  <form action="$ENV{SCRIPT_NAME}" method="POST">
  <input type="text" name="text" />
  <input type="submit">
  </form>
  <p>$data</p>
  </body>
  </html>
  HTML
  ;
  print $cgi->header(-charset => $charset);
  print encode($encoding, $html, Encode::JP::Mobile::FB_CHARACTER);

この例のように C<Encode::encode()> で L<Encode::JP::Mobile::FB_CHARACTER|Encode::JP::Mobile::Fallback> を使うことで、絵文字 => 絵文字の相互変換だけでなく 絵文字 => 文字 の相互変換も行なうことができる...

=head2 メール送信時のエンコーディング

メール送信時のエンコーディングは html 出力時とは大体の場合で異なります。L<Mail::Address::MobileJp> を使い、以下の C<detect_mail_encoding()> のように決めるとよいでしょう。

  use Mail::Address::MobileJp;
  
  sub detect_mail_encoding {
      my $mobile_to_address = shift;
      
      my $code =
          ( is_imode($mobile_to_address)    ) ? 'x-sjis-docomo'    :
          ( is_softbank($mobile_to_address) ) ? 'x-utf8-softbank'  :
          ( is_ezweb($mobile_to_address)    ) ? 'x-sjis-kddi-auto' :
                                                'x-sjis-docomo'    ;
      return $code;
  }

=head1 PC 向けに絵文字を代替表現する

PC 向けに携帯で入力された絵文字を [台風] といったように文字で代替表現するには、L<':props' オプション|Encode::JP::Mobile/UNICODE_PROPERTIES>と L<Encode::JP::Mobile::Character> を使い以下のように全絵...

  use Encode::JP::Mobile ':props';
  use Encode::JP::Mobile::Charnames;
  
  $html =~ s{(\p{InMobileJPPictograms})}{
      my $char = Encode::JP::Mobile::Character->from_unicode(ord $1);
      sprintf '[%s]', $char->name;
  }ge;
  
  print encode('utf-8', $html); # 例:いい天気[太陽]

=head2 表現を変える

上の方法だと PC ユーザーへ意味を伝えることはできますが、C<< $char->name >> はキャリアのページの絵文字一覧表にある名前を返すものなので、[丸に斜め線] ã‚„ [羽のはえたお札] といったè...

これらについて、別の表現にしたい場合は以下のように自分でマップを持ち変換するとよいでしょう。

  use utf8;
  my $fallback_name = {
      E => {



( run in 2.615 seconds using v1.01-cache-2.11-cpan-ceb78f64989 )