nroff / groff无法正确转换utf-8编码文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nroff / groff无法正确转换utf-8编码文件相关的知识,希望对你有一定的参考价值。
我有一个utf-8编码的roff文件,我想转换为手册页
$ nroff -mandoc inittab.5
但是,[äöüÄÖÜ]
中的字符,例如没有正确显示,因为似乎nroff假定ISO 8859-1编码(我正在获得[äöüÃÃÃ
)。用nroff
标志调用-Tutf8
不会改变行为,并且locale环境变量(我假设正确)设置为
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
只是一个包装脚本,并最终calles 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
与其他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
äöüÄÖÜ
通常使用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]
以上是关于nroff / groff无法正确转换utf-8编码文件的主要内容,如果未能解决你的问题,请参考以下文章
Linux From Scratch(LFS11.0)构建 LFS 系统 - Groff-1.22.4
Linux From Scratch(LFS11.0)构建 LFS 系统 - Groff-1.22.4