日本語 POD が perldoc で読めない

マルチバイトでかかれた(たとえば =encoding utf-8 な日本語)POD を perldoc で表示すると,

XXXXX

みたいになってしまいます(CentOS なり Ubuntu なりで)。


とりあえず読みたい,というのなら,

% perldoc -t Hoge::Nihongo

みたいに nroff コンバータではなくテキストコンバータで読めば読めます。が,強調表示とかされません。ちょいと悲しい。


Pod::Man の含まれる podlators 2.1.0 以降で pod2man コマンドに --utf8-u)オプションというのができて,これを使うと 8bit スルーで nroff に渡してくれるようになりました。

なので pod2man をダイレクトに叩くなら

% pod2man -u `perldoc -l Hoge::Nihongo` | nroff -man | $PAGER

みたくすれば読めます。


perldoc をそのまま使いたいなら……現時点(3.14)の Pod::Perldoc(の下位の Pod::Perldoc::ToMan)だと,--utf8 コマンドを渡せないんです。

なので,MY/ToMan.pm なるファイル*1をつくって

package MY::ToMan;

use strict;
use warnings;

use base qw( Pod::Perldoc::ToMan );

sub utf8 {
    my $self = shift;
    $self->{fixed} = 'CW" "--utf8';
}

1;

次のように実行すれば

% perldoc -MMY::ToMan -wutf8 Hoge::Nihongo

いけます。--utf8 オプションの渡しかたが XSS のように無理くり(pod2man 側では引数をとらないオプションなので)ですね。これなら pod2man を使ったほうがいいか。

Bug #39000 for Pod-Perldoc: Support for "pod2man --utf8" な RT もあがってるのでいつか Pod::Perldoc(::ToMan / ::ToNroff) が改善されるかもしれません。


もっといい方法があったらすみません。

2008-10-09 追記: zsh の関数で書いてみた

pod2man を使う方法でエイリアス,もとい function を書いてみました。

function perldoc() {
        # count options
        local opt
        while getopts ":" opt; do; done

        if [ $# -eq 1  -a  $OPTIND -le $# ]; then
                # single argument was specified
                local file; file=`command perldoc -l $1`
                [ $? -eq 0 ] && ( pod2man -u $file | nroff -man | $PAGER )
        else
                # passthru
                command perldoc $@
        fi
}

関数かくのはじめてなんで冗長かもですけど。

$PAGER かましてるけどパイプかまされてたらはずすようにしたいですね。どうするんだろ。

*1:2階層以上のパッケージ名じゃないと怒られるんです。