ユーザ用ツール

サイト用ツール


rssフィードをutf-8にする

RSSフィードをUTF-8にする。

Desktop Sidebarに内蔵されているRSSリーダなど、海外製のリーダの中には、UTF-8以外の日本語を正しく処理できないものがあります。一方、ページ自体の文字コードはEUC-JPやシフトJISなどの方が便利な場合も依然として多いため、ページの設定を安易にUTF-8にしたくはありません。

そういう場合に、RSSフィードのみをUTF-8にすることで、問題を回避できます。ここでは RDF 1.0(index.rdf)のみに関して、具体的に UTF-8にする方法を示しますが、その他のもの(RDF 0.9x/2.0やatom)でも同様にこれを行なうことができるはずです。

プラグインの導入

この作業には、mt-jcode.plというプラグインが必要になります。ダウンロードしたら、mt-plugin.pl.gz を解凍して、MTをインストールしたディレクトリのpluginsにコピーしておきます。プラグインの準備はこれで完了です。(簡単)

RSS配信が文字化けする場合

mt-jcode.plは、文字コードの判別を、Jcode::getcode()にお任せで行ないます。この種の文字コード判別は、充分な長さや、判別するのに足るような文字コードが含まれていないと、うまく機能しません。従って、ブログの記事タイトルなどのような短めの文字列ではうまく機能しない場合があります。

ではどうすればいいのか……。記事の文字コードは、MovableTypeが知っていますので、それを使えばいいわけです。具体的には、下のようにすればいいということになります。(短いので全文掲載)

package MT::Plugin::Jcode;

use MT::Template::Context;

MT::Template::Context->add_global_filter(jcode => sub {
    my($str, $code, $ctx) = @_;
    require Jcode;
    my $cfg = MT::ConfigMgr->instance;
    my $from = {'SHIFT_JIS'   => 'sjis',
                'ISO-2022-JP' => 'jis',
                'EUC-JP'      => 'euc',
                'UTF-8'       => 'utf8'}->{uc($cfg->PublishCharset)} || 'utf8';
    # my $from = Jcode::getcode($str) || 'utf8'; これがオリジナル(コメントアウト)
    return eval { Jcode->new($str, $from)->$code() } || $str;
});

1;

テンプレートの修正

修正するのは、RSS 1.0 Indexというテンプレートです。これを以下のように、日本語が混じる可能性がある、title, description, author, categoryなどに jcode=“utf8”を追加していくだけです。変更が終了したら、再構築をして完了です。

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:cc="http://web.resource.org/cc/"
 xmlns="http://purl.org/rss/1.0/">

<channel rdf:about="<$MTBlogURL$>">
<title><$MTBlogName encode_xml="1" jcode="utf8"$></title>
<link><$MTBlogURL$></link>
<description><$MTBlogDescription encode_xml="1" jcode="utf8"$></description>
<dc:language>ja</dc:language>
<dc:creator></dc:creator>
<dc:date><MTEntries lastn="1"><$MTEntryDate format="%Y-%m-%dT%H:%M:%S" language="en"$>
<$MTBlogTimezone$></MTEntries></dc:date>
<admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=<$MTVersion$>" />
<MTBlogIfCCLicense>
<cc:license rdf:resource="<$MTBlogCCLicenseURL$>" />
</MTBlogIfCCLicense>

<items>
<rdf:Seq><MTEntries lastn="15">
<rdf:li rdf:resource="<$MTEntryPermalink encode_xml="1"$>" />
</MTEntries></rdf:Seq>
</items>

</channel>

<MTEntries lastn="15">
<item rdf:about="<$MTEntryPermalink encode_xml="1"$>">
<title><$MTEntryTitle encode_xml="1" jcode="utf8"$></title>
<link><$MTEntryPermalink encode_xml="1"$></link>
<description><$MTEntryExcerpt encode_xml="1" jcode="utf8"$></description>
<dc:subject><$MTEntryCategory encode_xml="1" jcode="utf8"$></dc:subject>
<dc:creator><$MTEntryAuthor encode_xml="1" jcode="utf8"$></dc:creator>
<dc:date><$MTEntryDate format="%Y-%m-%dT%H:%M:%S" language="en"$><$MTBlogTimezone$></dc:date>
</item>
</MTEntries>

</rdf:RDF>

Desktop Sidebar:http://www.desktopsidebar.com

変更が完了したら、Newsroom のプロパティを開いて、ここにindex.rdfのURLを追加します。このとき既に化けたエントリがある場合には、一旦それを削除し、再度URLを入れて、一旦Desktop Sidebarを終了して、再起動してください。こうしないといつまでも化けたキャッシュデータを参照し、表示が直りません。

MovableTypeに関してへ戻る。

rssフィードをutf-8にする.txt · 最終更新: 2015/04/10 17:27 by 127.0.0.1