TrackBackが文字化け[解決?]

昨日書いた

うまくいったら、続きを書きます。

TrackBackが文字化け - Soukaku's HENA-CHOKO Blog

ということで、自分トコ向けのTracKBackがうまくいっているようなので、どうやったかをメモ。
とりあえず調べてみたところ、「トラックバックは、送信時にUTF-8に文字コードを統一する」という、緩やか〜な決まり事があったらしい。

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

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

ということですが、問題のコードは、MTのバージョンが違うのか、違う形で追加されていたりされていなかったりするので引用しませんでした。「MT Version 3.151-ja」では、「lib/MT.pm」の996行目付近を追加・修正するだけで対応出来ました。

Exciteブログでトラックバックが文字化け解決策

に書いてある修正点を、4.21にも施してみたところ、上手くいった次第。「3.15では大丈夫」ってあったけど、ちょっと自信がなかったのですよ。


バージョンによってコードに手を入れる位置が変わっているようなので、そのへんはうまく読み替えてください。

送信側。とりあえず、こちらだけやっておけば、問題はないはず。


eswat2:/var/www/MT3# diff -u lib/MT.pm.orig lib/MT.pm
--- lib/MT.pm.orig      2008-09-27 14:16:53.000000000 +0900
+++ lib/MT.pm   2008-10-16 21:31:51.000000000 +0900
@@ -1584,11 +1584,15 @@
         my $ua = MT->new_ua;
         ## 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( $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 );
+        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;
         ## Character encoding--best guess.

で、受信側。こちらはなくても大丈夫そうなのだけど、念のため。


eswat2:/var/www/MT3# diff -u lib/MT/App/Trackback.pm.orig lib/MT/App/Trackback.pm
--- lib/MT/App/Trackback.pm.orig        2008-09-27 14:16:30.000000000 +0900
+++ lib/MT/App/Trackback.pm     2008-10-16 21:23:41.000000000 +0900
@@ -245,11 +245,19 @@
         );
     }
-    my ( $title, $excerpt, $url, $blog_name )
+    my ( $title, $excerpt, $url, $blog_name,$icode  )
         = map scalar $q->param($_),
-        qw( title excerpt url blog_name);
+        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();
     return $app->_response(
         Error => $app->translate("Need a Source URL (url).") )

#受信の方は試してませんが。

トラックバック(0)

コメントする