先日の座談会でちらっと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
- 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();
- 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
- 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;
KOW
こんにちは。
上記の通り、変更してみたつもりなのですが、以下のmt.cgiにアクセスすると以下のエラーが出てしまいました。文法がわからないものでどう対処していいか分かりません。すみませんが、ご教授願えますか?
Got an error: Global symbol "$app" requires explicit package name at lib/MT.pm line 563. Compilation failed in require at lib/MT/App.pm line 14. BEGIN failed--compilation aborted at lib/MT/App.pm line 14. Compilation failed in require at lib/MT/App/CMS.pm line 14. BEGIN failed--compilation aborted at lib/MT/App/CMS.pm line 14. Compilation failed in require at mt.cgi line 21.
KOW
度々すみません。↑のエラーを読むと、なんか$appの宣言が必要って読めるんですが違いますかね?
milano
>KOWさん
すみません、MT.pm は、
$app->{cfg}->PublishCharset
ではなく、
$mt->{cfg}->PublishCharset
でした。
KOW
早速の回答ありがとうございます。
直りました。ありがとうございます。
かなめ
トラックバック先に残る私のurlの......./~kaname/blog/の~kの部分が変な漢字に化けるんですが解決方法ってあるんでしょうか?
oyama
はじめまして。
上記のMT.pmの変更と
http://rebecca.ac/milano/mt/archives/000063.html
の1.で、エキサイトはトラックバックの送受信とも文字化け解消しました。
ただ今度は、エキサイト以外のブログから受信したトラックバックが文字化けするようになってしまいました(送信した方は問題ないです)。
ただ上記のTrackback.pmの変更を行うと、エラーになってしまうのです。
元のソースを↓----------------------------------------------
my($title, $excerpt, $url, $blog_name, $enc) = map scalar $q->param($_),
qw( title excerpt url blog_name charset);
no_utf8($tb_id, $title, $excerpt, $url, $blog_name);
----------------------------------------------
上記ソースに変更し、PublishCharset} || 'utf8';
のところだけ'euc'に変えました(うちのサーバーが文字コードがEUC-JPで、どうしてもEUCにしなければならないので)。
素人ですみません。もしお気づきの点があれば教えていただけると幸いです。
よろしくお願いします。
匿名
なぜ,"encoding" ではなく,"charset" なのでしょう。
その点理解に苦しみます。