Term::Encodingのサンプルプログラム

perldoc.jpに翻訳記事を上げるにあたりサンプルプログラムがあった
方がいいんじゃなかろうかと思いましたので、自分が翻訳したものに
ついてはサンプルプログラムを書こうかと思います。


訳があっても実例を知らないことには使い方もよくわからないと
思うし、実際にそういう声もありますので、何かのお役に立てれば
いいかなと思います。

概要

Term::Encodingは現在利用しているターミナルエミュレータ(xterm, gnome-terminal, iterm等)に
設定されている文字コードを検出するためのモジュールです。

用途

自分しか使わないプログラムであれば、Encode::encodeする部分は
決め打ちでもいいと思います。最近だと UTF-8で間違いないでしょう。
ただし他の人に使ってもらう場合であれば、そこは柔軟性を持たせた
方がいいでしょう。EUC-JPの人もいるかもしれませんし、Shift_JIS
人もいるかもしれませんのでね。


「$encodingっていう変数を書き換えて」、設定ファイルを用意するとかも
考えられますが、そんなの面倒なので自動検出したいですよね。


そこで使えるのが Term::Encodingです。term_encoding関数を呼び出せば、
今設定されている文字コードが取得できます。これを使って表示するものを
encodeすれば、文字化けすることなく表示できることでしょう。

サンプルプログラム

本ブログの RSSを取得して、タイトルを表示する簡単なプログラムを示します。
最後の printf文にある Encode::encodeで Term::Encoding::term_encodingを
使って取得した文字コードを利用しています。

#!/usr/bin/env perl
use strict;
use warnings;

use LWP::UserAgent;
use XML::RSS::LibXML;
use Encode;

use Term::Encoding qw(term_encoding);

my $url = 'http://d.hatena.ne.jp/syohex/rss';

my $ua = LWP::UserAgent->new;

my $res = $ua->get($url);
unless ($res->is_success) {
    die "Can't download $url\n";
}

my $rss = XML::RSS::LibXML->new;

eval {
    $rss->parse($res->decoded_content);
};

if ($@) {
    die "Parse Error\n";
}

my $encoding = term_encoding();
for my $item (@{$rss->{items}}) {
    printf "Title %s \n", encode($encoding, $item->{title});
}

まとめ

Term::Encodingのサンプルプログラムについて説明しました。
なるべくではありますが、翻訳したらサンプルプログラムを
書いてブログに上げるということをしようと思います。