Sim*_*mme 4 linux encoding utf-8
我有一个 utf-8 编码的 roff 文件,我想将其转换为联机帮助页
$ nroff -mandoc inittab.5
Run Code Online (Sandbox Code Playgroud)
但是,[äöüÄÖÜ], eg 中的字符没有正确显示,因为似乎 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=
Run Code Online (Sandbox Code Playgroud)
由于nroff只是一个包装脚本并最终调用groff我检查了对后者的调用,即:
$ groff -Tutf8 -mandoc inittab.5
Run Code Online (Sandbox Code Playgroud)
比较 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
Run Code Online (Sandbox Code Playgroud)
这种行为对我来说似乎很奇怪(为什么我得到一个额外的C3 83并且将原始字节序列全部截断以用于大变音和ß?)
这是为什么,我如何制作nroff/groff正确转换我的 utf-8 编码文件?
编辑:我正在使用 GNU nroff (groff) version 1.22.2
小智 6
与其他 troff 实现(即 Plan 9 和 Heirloom troff)不同,groff 不支持文档中的 UTF8。但是,可以使用preconv(1)预处理器实现 UTF8 输出,它将文件中的 UTF8 字符转换为 groff 本机转义序列。
以这个groff_ms(7)文档为例:
.TL
StackOverflow Test Document
.AU
ToasterKing
.PP
I like going to the café down the street
äöüÄÖÜ
Run Code Online (Sandbox Code Playgroud)
groff正常使用,我们得到:
StackOverflow Test Document
ToasterKing
I like going to the café down the street
äöüÃÃÃ
Run Code Online (Sandbox Code Playgroud)
但是当使用preconv | groffor 时groff -k,我们得到:
StackOverflow Test Document
ToasterKing
I like going to the café down the street
äöüÄÖÜ
Run Code Online (Sandbox Code Playgroud)
查看 的输出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]
Run Code Online (Sandbox Code Playgroud)