nroff/groff不能正确转换UTF-8编码文件

7
我有一个使用utf-8编码的roff文件,想要将其转换为man手册。
$ nroff -mandoc inittab.5

然而,包含[äöüÄÖÜ]等字符的文本不能正确地显示,因为似乎nroff假定了ISO 8859-1编码(我得到了[äöüÃÃÃ])。使用-Tutf8标志调用nroff并不会改变行为,区域环境变量已设置(我认为是正确的)。

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

比较源文件和输出文件中字符的字节编码,我得到了以下转换:

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


当你运行 less inittab.5 命令时,你能看到正确的字符吗?顺便说一句,这个问题不适合在这个网站上讨论,你可以去 Unix/Linux StackExchange 上寻求更好的帮助。 - n. m.
是的!输入文件一切正常。 - Simon Fromme
1
显然,nroff认为它的输入是Latin-1,并尝试将其转码为UTF-8。尝试使用-Tlatin1运行以避免转码。 - n. m.
看起来 groff 完全不支持 UTF-8 输入。https://www.gnu.org/software/groff/manual/html_node/Input-Encodings.html - n. m.
好的,那很有道理。但是为什么我的大部分 Gentoo 程序都带有 utf-8 编码的 man 手册呢?我可以将它们转换为 latin1,但这会省略其他字符。您是否知道支持 utf-8 输入的 nroff 替代品? - Simon Fromme
1个回答

12

与其他troff实现(即Plan 9和Heirloom troff)不同,groff不支持文档中的UTF8。但是,可以使用预处理器实现UTF8输出,该预处理器将文件中的UTF8字符转换为groff本机转义序列。

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的输出,您可以看到它如何将字符转换为转义序列:

.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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接