Trackbackの文字コード指定方法最終(予定)

  • 投稿日:
  • by
  • カテゴリ:

先日の座談会でちらっとTrackbackの文字コードの指定方法について話が出ました。
その時、送るときはUTF-8で統一しませんか?という案が出ました。参加したメンバーが軒並みすごい方々だったので、この案を実装しても文句出ないかなと思い、早速実装した日本語化パッチをアップしました。
早速といいながら、座談会から既に1週間経ってしまいましたが。

ということで、Movable TypeのTrackbackはUTF-8で送るのを最終案としたいところ。賛同が得られたらウレシイです。

ソース読めばわかんだろと思って書かなかったけど、仕様はこんな感じ。

◆送信時
・文字コードはUTF-8で送信
・Content Bodyに「charset=utf-8」を付与

◆受信時
・charsetパラメータがあればそれを信用
・charsetパラメータが無ければタイトル等から文字コードを推測

ということで、送信時にUTF-8にするようになっただけで、他のコードで送られても問題ないし、送られる側のサイトで文字コード判別の助けになるようにcharsetパラメータも送ってるし、いろいろと考えています。
RubyでUTF-8の扱いが面倒とか言われちゃうと、すみませんとしか言いようがないですが。

内容はこちら。

    lib/MT/App/Trackback.pm
  1. 120行目以降を書き換え
    my($title, $excerpt, $url, $blog_name) = map scalar $q->param($_),
                                  qw( title excerpt url blog_name);

    no_utf8($tb_id, $title, $excerpt, $url, $blog_name);
      ↓
    my($title, $excerpt, $url, $blog_name, $icode) = map scalar $q->param($_),
                                  qw( title excerpt url blog_name charset);

    no_utf8($tb_id, $title, $excerpt, $url, $blog_name);
    require Jcode;
    my $charset = {'Shift_JIS'=>'sjis','ISO-2022-JP'=>'jis','EUC-JP'=>'euc',
                   'UTF-8'=>'utf8'}->{$app->{cfg}->PublishCharset} || 'utf8';
    my $incoming = {'shift_jis'=>'sjis','iso-2022-jp'=>'jis','euc-jp'=>'euc',
                    'utf-8'=>'utf8'}->{lc($icode)} || Jcode::getcode($excerpt . $title . $blog_name);
    $title = Jcode->new($title, $incoming)->$charset();
    $excerpt = Jcode->new($excerpt, $incoming)->$charset();
    $blog_name = Jcode->new($blog_name, $incoming)->$charset();

  2. 173行目移行を書き換え
    if (length($excerpt) > 255) {
        $excerpt = substr($excerpt, 0, 252) . '...';
    }
      ↓
    if (length($excerpt) > 255) {
        $excerpt = substr(Jcode->new($excerpt, $charset)->euc(), 0, 252);
        if ($excerpt =~ /\x8F$/ or $excerpt =~ tr/\x8E\xA1-\xFE// % 2) {
            chop $excerpt;
        }
        $excerpt = Jcode->new($excerpt . '...', 'euc')->$charset();

    }
    lib/MT.pm
  1. 560行目以降を書き換え
    ## Build query string to be sent on each ping.
    my @qs;
    push @qs, 'title=' . MT::Util::encode_url($entry->title);
    push @qs, 'url=' . MT::Util::encode_url($entry->permalink);
    push @qs, 'excerpt=' . MT::Util::encode_url($entry->get_excerpt);
    push @qs, 'blog_name=' . MT::Util::encode_url($blog->name);
    my $qs = join '&', @qs;
      ↓
    ## Build query string to be sent on each ping.
    require Jcode;
    my $charset = {'Shift_JIS'=>'sjis','ISO-2022-JP'=>'jis','EUC-JP'=>'euc',
                   'UTF-8'=>'utf8'}->{$mt->{cfg}->PublishCharset} || 'utf8';

    my @qs;
    push @qs, 'title=' . MT::Util::encode_url(Jcode->new($entry->title, $charset)->utf8);
    push @qs, 'url=' . MT::Util::encode_url(Jcode->new($entry->permalink, $charset)->utf8);
    push @qs, 'excerpt=' . MT::Util::encode_url(Jcode->new($entry->get_excerpt, $charset)->utf8);
    push @qs, 'blog_name=' . MT::Util::encode_url(Jcode->new($blog->name, $charset)->utf8);
    push @qs, 'charset=utf-8';
    my $qs = join '&', @qs;