[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:21905] Re: man-db and JLESSCHARSET



久保田です。


man-db の改良についてです。

まず、ISO-8859-1,2 な manpages の表示ですが、
jgroff 1.15+ja-3.2 の代わりに groff 1.15-3.ja.3 をインストール
すると、表示できるようになりました。これは woody にしかないの
ですが...。それから、韓国語 manpages の表示にはまだ成功して
いません。

# いま、hanterm 上で、man -Lko -Tnippon ls とやると、いちおう文字化け
# はせずに表示されてるみたいです。行の切りかたとかはわからないけど。


さて、man-db は、manpage の言語によって groff に渡す -T オプション
および less に渡す LESSCHARSET 環境変数を変えるようになっています。

------------man-db-2.3.6/src/man.c--------
struct lt {
       char *	lang;
       char *	device;
       char *	charset;
} lang_table[] =	{
	/* LANG		roff_device	LESSCHARSET */
	{ "ja"		, "nippon"	, "ja"		},
	{ "*"		, "latin1"	, "latin1"	},
	{ 0		, 0		, 0		} };
------------------------------------------

そこで、英語以外の ISO-8859-1 言語の場合には、roff_device が
ascii、LESSCHARSET が latin1 になるように、man-db を改造して
みました。

----------------------------------
	{ "da"		, "latin1"	, "latin1"	}, /* Danish */
	{ "de"		, "latin1"	, "latin1"	}, /* German */
	{ "en"		, "ascii"	, "ascii"	}, /* English */
	{ "es"		, "latin1"	, "latin1"	}, /* Spanish */
	{ "fi"		, "latin1"	, "latin1"	}, /* Finnish */
	{ "fr"		, "latin1"	, "latin1"	}, /* French */
	{ "ga"		, "latin1"	, "latin1"	}, /* Irish */
	{ "is"		, "latin1"	, "latin1"	}, /* Icelandic */
	{ "it"		, "latin1"	, "latin1"	}, /* Italian */
	{ "ja"		, "nippon"	, "ja"		}, /* Japanese */
	{ "nl"		, "latin1"	, "latin1"	}, /* Dutch */
	{ "no"		, "latin1"	, "latin1"	}, /* Norwegian */
	{ "pt"		, "latin1"	, "latin1"	}, /* Portuguese */
	{ "sv"		, "latin1"	, "latin1"	}, /* Swedish */
	{ "*"		, "ascii"	, "latin1"	}, /* universal */
----------------------------------

といったぐあいです。ところで、ISO-8859-1 で表現できる言語は
もうひとつ、フェロー語というのがあるのですが、これは分かりません
でした。フェロー語ってなんですか?

# LESSCHARSET=latin1 は、0xa0-0xff が印字可能文字であるという
# 以外は、LESSCHARSET=ascii と同じです。要するに、8 ビット文字
# ということですね。なんだかなぁな命名ですが。

これでうまくいくと思ったのですが、この改造版 man-db を使うと、
ハンガリー語 manpages を表示させると ISO-8859-2 文字が正しく
表示されません。例えば、英語で NAME のところはハンガリー語では
SGML 式に書くと NÉV、TeX 式に書くと N\'EV となるのですが、
NEV と、ASCII 文字に変換されて表示されてしまいます。

# べつに私がハンガリー語を知っているわけじゃないです。

つまり、groff の -Tlatin1 は、-Tascii と比べて、ハイフンや
(C) マークに ISO-8859-1 文字を使うという相違以外にも、
ISO-8859-1 文字を近い ASCII 文字に変換するという相違もある
ようなのです。

# ISO-8859-1 と、ISO-8859-2 は、É もふくめて、
# ほとんど同じです。ただ、ISO-8859-1 の (C) マーク (0xa9) は
# ISO-8859-2 では別の文字になるので、latin1 を使うと化けた
# manpages が表示されてしまいます。

というわけで、man-db だけでは問題は解決できず、groff にも
手を加えないといけないことが分かりました。

方針としては、

(1) manpages のソースに含まれる 8 ビットコードには手を加えない
    (という点では latin1 と同じ) けど、ハイフンとか (C) とか、
    能動的に ISO-8859-1 文字を使うことはしない (という点では
    ascii と同じ)、新しいデバイスタイプを作る。命名をどうするか
    というのが問題だけど。

(2) latin2 などの新しいデバイスタイプを作る。

個人的には、latin1 という名前が特別扱いされる現状がいやなので、
(2) のほうが好きなんですが、(1) のほうが楽ですね。でも、考えて
みれば、ascii というデバイスタイプにおいて、0xa0-0xff が ASCII
文字にマッピングされるという動作は、0xa0-0xff は ISO-8859-1 だ
という仮定に基づいていますね。どうすればいいんでしょう...

# こういうのって、ほんと、なんだかなぁな世界ですね。

で、groff (1.15-3.ja.3) のソースを見たのですが、難解です。
devascii とか devlatin1 とかのディレクトリがあるので、それが
それぞれの動作を定義しているらしいということは分かるのですが、
そのディレクトリの中のファイルは、Makefile らしきファイルも
含め、ほとんど全く理解できません。


# とりあえず、debian-devel@org とか debian-i18n@org とかで
# 議論するつもりでいます。

---
Tomohiro KUBOTA <kubota@debian.or.jp>
http://surfchem0.riken.go.jp/~kubota/