The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Encode::JP::Mobile::BestPractice.ja - Encode::JP::Mobile をクールにのりこなす

本文

utf-8 か Shift_JIS か

utf-8 が使える機種では utf-8 をつかった方がいいでしょう。

SoftBank 3G では sjis だと絵文字をカットしてしまう機種があるようなので、UTF-8 で サイトを構築せざるをえません。キャリアごとに文字コードが違うのもおかしな話ですから、 この際全部 utf-8 にしてしまいましょう。

ただし、SoftBank の W 型より前、EZweb の XHTML 非対応機種、DoCoMo の XHTML 非対応機種は utf-8 に対応していませんので、Shift_JIS を使う必要があります。

KDDI 絵文字領域はKDDI-AutoかKDDI-CP932か

KDDI の端末で絵文字にわりあてられている Unicode の領域は

  CP932 ベースの 外字→Unicode PRIVATE AREA の領域
  KDDI/AUでutf-8のHTMLフォームから送られてくる絵文字コード

の2つがあり、我々は便宜的に前者を KDDI-CP932, 後者を KDDI-Auto とよんでいます(これは仮称であり もっとクールな名前を思いつけばただちに rename されるでしょう)。

KDDI-CP932 は、SoftBank 絵文字のページ6とかぶっていることから、データベースに保存する際には KDDI-Auto 領域をつかうのがベストプラクティスです。

実際にどういうコードでエンコーディングを決定するか

下記のようなコードで適切な encoding を選定できます。

    use HTTP::MobileAgent;
    
    sub HTTP::MobileAgent::display_utf8 {
        my $self = shift;
        $self->xhtml_compliant;
    }

    sub HTTP::MobileAgent::encoding {
        if ( $agent->is_non_mobile ) {
            return 'utf-8';
        } else {
            if ($agent->is_airh_phone) {
                # AirHPhone は utf8 だと絵文字うまく表示できない
                return 'x-sjis-airh';
            } elsif ($agent->is_ezweb && !$agent->xhtml_compliant) {
                # KDDI-Auto つかうのがベストプラクティス
                return 'x-sjis-kddi-auto'; # should use x-sjis-kddi-auto
            } else {
                my $charset = $agent->xhtml_compliant ? 'utf8' : 'sjis';
                return join '-', 'x', $charset, lc( $agent->carrier_longname );
            }
        }
    }

    sub encode_to_mobile {
        my ($content, $agent) = @_;
        my $encoding = $agent->encoding;
        # sjis の場合、該当のキャリアの絵文字に埋める
        if ($encoding =~ /^x-sjis-(.+)$/) {
            my $target = $1 eq 'airh' ? 'docomo' : $1;
            $content = encode "x-utf8-$target", encode("x-utf8-$target", $content);
        }
        encode $encoding, $content;
    }

    encode_to_mobile("\x{E001}", HTTP::MobileAgent->new);

AUTHOR

Tokuhiro Matsuno

SEE ALSO

http://developers.SoftBankmobile.co.jp/dp/tool_dl/web/picword_06.php http://subtech.g.hatena.ne.jp/miyagawa/20071112/1194865208