我需要使用 fmt 来格式化一些希腊语文本输出,但它的行为与拉丁字符不同。例如,考虑以下 15 个字符的句子。
带有拉丁字符:
$echo "Have a nice day" | fmt -w 16
Have a nice day
Run Code Online (Sandbox Code Playgroud)
但是,奇怪的是,使用非拉丁字符:
$echo "???? ? ???? ???" | fmt -w 16
???? ?
???? ???
Run Code Online (Sandbox Code Playgroud)
事实上,对于上面的字符串,它打印没有换行符的句子的最小值是-w 28
:
$echo "???? ? ???? ???" | fmt -w 28
???? ? ???? ???
$echo "???? ? ???? ???" | fmt -w 27
???? ? ????
???
Run Code Online (Sandbox Code Playgroud)
如果可能的话,有人可以解释为什么会发生这种情况以及如何解决它吗?
要回答您的问题,它不起作用,因为希腊字符是非拉丁字符、Unicode 字符,并且:
与par不同, fmt 没有 Unicode 支持,...
https://en.wikipedia.org/wiki/Fmt
不幸的是,关于如何操作的问题的第二部分,
虽然最近有一份关于如何包装 Unicode 的技术报告,例如 Heninger, Unicode Line Breaking Algorithm , 2015-06-01 http://www.unicode.org/reports/tr14/但这似乎只是规范,没有实际实现或提及软件操作示例。您可以尝试通过列出的电子邮件询问作者。
由于 Wikipedia 上的文章fmt
提到了par
,并且可以通过 获得apt-get
,因此我决定在您发布的文本上尝试一下。
但是我没有成功,它仍然没有按照您希望的方式包装:
$ echo "???? ? ???? ???" | par 16gr
???? ?
???? ???
Run Code Online (Sandbox Code Playgroud)
该man
页面非常困难,甚至作者也警告说它是:not well-written for the end-user
,但是如果您下定决心,您可以试试运气阅读它。