groff-base-1.19.3-alt1.20080814 У меня не получилось заставить nroff нормально отображать маны в однобайтовых кодировках при юникодной локали. Вот test case: [c0der@xxx ~]$ (echo ".\\\" -*- coding: utf-8 -*-"; zcat /usr/share/man/ru/man1/test.1.gz | iconv -f koi8-r -t utf8) >test-utf.1 [c0der@xxx ~]$ head test-utf.1 .\" -*- coding: utf-8 -*- .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.35. .TH TEST "1" "Май 2006" "test 5.97" "Команды пользователя" .SH ИМЯ test \- проверяет типы файлов и сравнивает значения .SH ОБЗОР .B test \fIВЫРАЖЕНИЕ\fR .br .B test [c0der@xxx ~]$ gzip test-utf.1 [c0der@xxx ~]$ sudo mv -vf test-utf.1.gz /usr/share/man/ru/man1 `test-utf.1.gz' -> `/usr/share/man/ru/man1/test-utf.1.gz' removed `test-utf.1.gz' Далее man test-utf и я не вижу русского, вижу лишь кракозябры. man-1.6f-alt2, nroff запускается с опциями -Dkoi8-r -Tutf8 -mandoc Также не работает указание и других кодировок (вроде koi8-r/cp1251, кстати CP1251 и KOI8-U, похоже вообще не распознаются? Я вижу, что они закомментированы в файле groff/src/preproc/preconv/preconv.cpp, также распознаётся только строка UTF-8, но не UTF8, возможно, лучше распознавать и то и другое).
$ locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL= $ bzcat /usr/share/man/ru/man1/gpg.1.bz2 > /tmp/gpg.1 $ head -3 /tmp/gpg.1 .\" -*- mode: troff; coding: koi8-r -*- .TH "gpg" "1" .SH "NAME" $ groff -Dkoi8-r -Tutf8 -mandoc /tmp/gpg.1 |head -6 gpg(1) gpg(1) NAME gpg — инструмент для шифрования и цифровой подписи $ groff -k -Tutf8 -mandoc /tmp/gpg.1 |head -6 gpg(1) gpg(1) NAME gpg — инструмент для шифрования и цифровой подписи $ iconv -fkoi8-r -tutf8 < gpg.1 > gpg-utf.1 $ head -3 /tmp/gpg-utf.1 .\" -*- mode: troff; coding: utf-8 -*- .TH "gpg" "1" .SH "NAME" $ groff -Dkoi8-r -Tutf8 -mandoc gpg-utf.1 |head -6 gpg(1) gpg(1) NAME gpg — инструмент для шифрования и цифровой подписи --- У меня всё видно. Можно точный testcase приаттачить к баге ?
Действительно портит всё не nroff, а gtbl: $ cat man1/gpg-utf.1 | nroff -Dkoi8-r -Tutf8 -mandoc Так видно. $ cat man1/gpg-utf.1 | gtbl | nroff -Dkoi8-r -Tutf8 -mandoc Так уже всё в кракозябрах возвращается. А man именно вот так запускает.
(In reply to comment #2) > Действительно портит всё не nroff, а gtbl: > > $ cat man1/gpg-utf.1 | nroff -Dkoi8-r -Tutf8 -mandoc > > Так видно. > > $ cat man1/gpg-utf.1 | gtbl | nroff -Dkoi8-r -Tutf8 -mandoc > > Так уже всё в кракозябрах возвращается. А man именно вот так запускает. А зачем он groff так запускает? $ groff -h |grep tbl -t preprocess with tbl Этот ключ nroff транслирует groff: $ cat /tmp/gpg-utf.1 |tbl | groff -Dkoi8-r -Tutf8 -mandoc |head -6 gpg(1) gpg(1) NAME gpg — п╦п╫я│я┌я─я┐п╪п╣п╫я┌ п╢п╩я▐ я┬п╦я└я─п╬п╡п╟п╫п╦я▐ п╦ Действительно крокозяблы, но: $ cat /tmp/gpg-utf.1 | groff -t -Dkoi8-r -Tutf8 -mandoc |head -6 gpg(1) gpg(1) NAME gpg — инструмент для шифрования и цифровой подписи Всё нормально. Оно понятно почему ... groff -k -t запускает tbl после preconv. Это бага в man.
Да, точно. Спасибо, за помощь.
Но и это ещё не всё. man добавляет в заголовок файла некоторые команды для отображения, например: .ll 12.3i .nr LL 12.3i .pl 1100i В итоге магическая строка с кодировкой сдвигается на 3 строчки и preconv не может распознать кодировку.
(In reply to comment #5) > В итоге магическая строка с кодировкой сдвигается на 3 строчки и preconv не > может распознать кодировку. Просто теперь нужно добавлить несколько сложнее, чем просто дописывать в поток перед распакованной man-страницей.
(In reply to comment #6) > Просто теперь нужно добавлить несколько сложнее, чем просто дописывать в > поток перед распакованной man-страницей. Да уж. Собственно, разобрался вроде. Теперь awk-ом это всё делается. Вечерком ещё дома проверю на однобайтовой кодировке и выложу новую сборку на people/
(In reply to comment #7) > Вечерком ещё дома проверю на однобайтовой кодировке и выложу новую сборку > на people/ ftp://ftp.altlinux.org/pub/people/php-coder/man/man-1.6f-alt3.i586.rpm
Reassign to new maintainer.
Fixed in 1.6f-alt10