nroff / groff неправильно конвертирует файл в кодировке utf-8 - PullRequest
0 голосов
/ 10 октября 2018

У меня есть файл roff в кодировке utf-8, который я хочу преобразовать в man-страницу с

$ nroff -mandoc inittab.5

Однако символы в [äöüÄÖÜ], например, отображаются неправильно, так как кажется, что nroffпредполагает кодировку ISO 8859-1 (вместо этого я получаю [äöüÃÃÃ). Вызов nroff с флагом -Tutf8 не меняет поведение, а переменные окружения локали (я полагаю правильно) установлены на

LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE="de_DE.utf8"
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=

Поскольку nroff является только сценарием-оберткой и в конечном итоге вызывает groff Я проверил вызов последнего:

$ groff -Tutf8 -mandoc inittab.5

Сравнение кодировок байтов символов в файле src иВ выходной файл я получаю следующие преобразования:

character  src file  output file
---------  --------  -----------
ä          C3 A4     C3 83 C2 A4
ö          C3 B6     C3 83 C2 B6
ü          C3 BC     C3 83 C2 BC
Ä          C3 84     C3 83
Ö          C3 96     C3 83
Ü          C3 9C     C3 83
ß          C3 9F     C3 83 

Это поведение кажется мне очень странным (почему я получаю дополнительный C3 83, и исходная последовательность байтов усекается полностью для больших умляутов и ß?)

Почему это так и как я могу nroff / groff правильно преобразовать мой файл в кодировке utf-8?

РЕДАКТИРОВАТЬ: Я использую GNU nroff (groff) version 1.22.2

1 Ответ

0 голосов
/ 05 декабря 2018

В отличие от других реализаций troff (а именно Plan 9 и Heirloom troff), groff не поддерживает UTF8 в документах.Однако вывод в формате UTF8 может быть достигнут с помощью препроцессора preconv(1), который преобразует символы UTF8 в файле для выделения собственных escape-последовательностей.

Возьмем, к примеру, этот документ groff_ms(7):

.TL
StackOverflow Test Document
.AU
ToasterKing
.PP
I like going to the café down the street

äöüÄÖÜ

Используя groff обычно, мы получаем:

                StackOverflow Test Document


                        ToasterKing


     I like going to the café down the street

äöüÃÃÃ

Но при использовании preconv | groff или groff -k мы получаем:

                StackOverflow Test Document


                        ToasterKing


     I like going to the café down the street

äöüÄÖÜ

Глядя на вывод preconv, вы можете увидеть, как он преобразует символы в escape-последовательности:

.lf 1 so.ms
.TL
StackOverflow Test Document
.AU
ToasterKing
.PP
I like going to the caf\[u00E9] down the street

\[u00E4]\[u00F6]\[u00FC]\[u00C4]\[u00D6]\[u00DC]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...