試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

日本語manをUTF-8化してless経由で表示させる

(2014/9/22)本記事は2007年6月時点のGentooにおける内容となる。他のディストリでは特に問題なくmanページが参照できる。
以下は以前の内容となる。

UTF-8エンコーディングで日本語manページをインストールしておくことで、環境変数の変更(参考)をせず、そのままless経由で日本語manページが見られるようになった。
(2007/9/26)下の作業は手順が面倒なので、ebuildファイルで自動化するようにした。→「UTF-8でman-pages-jaをインストールし、既存のEUC-JPなmanページもUTF-8に変換するebuild

利点

  • マニュアルページを読めるようにするまでに独自の面倒な手順が必要なくなる。
  • 実行時、表示までの時間がわずかに短縮される。

問題点

  • 今後、日本語man作成者(JMプロジェクトや、sl,w3m.lha,dpkg,nkfなどのEUC-JPな日本語manページを含むパッケージの作成者)がEUC-JPのエンコーディングでリリースをし続ける限り、それらのバージョンアップごとに、変換作業を行う必要が出る。

準備

groffパッケージのバージョン1.19系では、EUC-JPなmanページをLANG/PAGER指定して見るときには問題なかったが、指定なしでUTF-8変換したものをless経由で表示する際に問題が起き、1.18.1.1に下げると問題なくなった。もし1.19系を使っている場合、1.18系に下げた上で、
ファイル名: /etc/portage/package.mask

>=sys-apps/groff-1.19

1.19系は使わないように指示しておく。

man-pages-jaとportage-man-pages-jaをUTF-8に変換してインストールしてみる

既に「man-pages-ja」パッケージがインストールされている場合、下のほうで、インストール済みのEUC-JPなmanページファイルを一括UTF-8変換する手順を紹介しているので、ここの手順で上書きインストールする必要はない。
流れとしては、ファイル展開後、インストールがされる前に、マニュアルページをUTF-8エンコーディングに変換する。emergeを使用してサスペンドしてもよいのだが、止めるタイミングが難しいので、ebuildコマンドを使ってみる。

  • 「work/m*/manual/*/*/*.[1-9]」というのは、「man-pages-ja」のmanページの場所。
  • 「work/p*/*/*.[1-9]」というのは、同時にインストールされる「portage-man-pages-ja」のmanページの場所。
$ su
# ebuild /usr/portage/app-i18n/man-pages-ja/man-pages-ja-20070515.ebuild fetch unpack
# cd /var/tmp/portage/app-i18n/man-pages-ja-*
# for file in work/m*/manual/*/*/*.[1-9] work/p*/*/*.[1-9]; do mv ${file} ${file}.old; iconv -f eucjp -t utf8 ${file}.old > ${file}; rm ${file}.old -f; done
# ebuild /usr/portage/app-i18n/man-pages-ja/man-pages-ja-20070515.ebuild compile install qmerge clean
# rmdir /var/tmp/portage/app-i18n/

動作確認

適当なmanページで実験。下の例ではわざとフルパスでmanを実行している。なお、/etc/man.confは一切いじっていない。

$ /usr/bin/man man
$ /usr/bin/man ebuild

インストール済みのEUC-JPなmanページをUTF-8へ変換

$ for file in /usr/share/man/ja/*/*.gz; do zcat ${file} | iconv -f utf8 -t utf8 >/dev/null 2>&1 || echo ${file}; done > /tmp/gz_list.txt
$ for file in /usr/share/man/ja/*/*.bz2; do bzcat ${file} | iconv -f utf8 -t utf8 >/dev/null 2>&1 || echo ${file}; done > /tmp/bz2_list.txt

の両方を実行することで、gzip圧縮・bzip2圧縮ごとにUTF-8でないマニュアルページファイルがリストアップできる。そこで

$ su
# for file in $(cat /tmp/gz_list.txt); do mv ${file} ${file}.old; zcat ${file}.old | iconv -f eucjp -t utf8 | gzip -9 > ${file}; rm ${file}.old; done
# for file in $(cat /tmp/bz2_list.txt); do mv ${file} ${file}.old; bzcat ${file}.old | iconv -f eucjp -t utf8 | bzip2 > ${file}; rm ${file}.old; done
# exit
$ rm /tmp/gz_list.txt /tmp/bz2_list.txt -f

のように実行することで、元の圧縮形式・ファイル名のまま、エンコーディングUTF-8に変換できる。もう一度UTF-8でないマニュアルページのリストアップを行い、

$ for file in /usr/share/man/ja/*/*.gz; do zcat ${file} | iconv -f utf8 -t utf8 >/dev/null 2>&1 || echo ${file}; done
$ for file in /usr/share/man/ja/*/*.bz2; do bzcat ${file} | iconv -f utf8 -t utf8 >/dev/null 2>&1 || echo ${file}; done

両方とも何も出力されないことを確認できればOK。これでたまにチェックをしながら運用していけば、問題はないのではないかと思う。

関連記事:

使用したバージョン:

  • man 1.6e-r3(USE=nls)
  • groff 1.18.1.1(USE=X cjk)
  • less 394(USE=unicode)
  • man-pages-ja 20070515