2005年 5月 21日

トラックバックの文字化け対策

カテゴリ: サーバー / 0 コメント

特定のサイトにトラックバックをすると文字化けすることがわかりましたんで
修正してみました・・・。
原因はうちが「EUC-JP」でそのサイトは(exblog)UTF-8しか受け付けないらしい・・。
まぁUTF-8でping出せば世の中うまく行くらしいので、うちもトラバ送信はUTFで出すことにした。

参考サイトは「BLOG質問箱」さんやMilanoさんのサイトです

まずはもしもの為に元ファイルコピーしておいて、「Trackback.pm」と「MT.pm」に修正を加えます。
詳しくはBLOG質問箱やMilanoさんとこに詳しくありますので熟読してください。


個人的保守として記載しておきます。
もし参考にされる方はこのページではなく「BLOG質問箱」さんやMilanoさんのサイトにて
最新の情報を必ず参考にしてください。


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;

ーーーーこれに書き換え


このエントリーのトラックバックURL:
http://webspace.dynSite.net/cgi-bin/mt-tb.cgi/137