【发布时间】:2020-12-20 06:40:38
【问题描述】:
如何使 printf 将值对齐到列中,即使是非 ascii 字符?
以下命令应将第二个和第三个参数中的值对齐到固定的 20 个字符宽度:
printf "%-20s %-20s\n" "Foo" "Bar"
printf "%-20s %-20s\n" "Fooo" "Bar"
printf "%-20s %-20s\n" "Foooó" "Bar"
printf "%-20s %-20s\n" "Foooóó" "Bar"
我希望打印以下内容:
Foo Bar
Fooo Bar
Foooó Bar
Foooóó Bar
实际上,这是打印出来的:
Foo Bar
Fooo Bar
Foooó Bar
Foooóó Bar
由于某种原因,任何非 ascii 字符(例如我的示例中的 ó)都会将列缩短 1 个字符。
【问题讨论】:
-
你用的是什么编码?
-
@user1934428 我使用 UTF8 重现了这个问题。
-
@adamsfamily :这似乎是不幸的,但
printf中的supposed behaviour。 -
谢谢@user1934428 - 这真的很不幸。
printf正在打印字符(不是字节),因此它应该计算字符(不是字节)-IMO。 -
@adamsfamily :这也是我的看法。我个人的猜测是 POSIX 的标准化试图保持与旧脚本的向后兼容性,如果你还记得 Unix 的早期(在引入 locale 之前),多字节处理就是其他一切比直截了当。可能,bash
printf只是依赖于 C 编译器中的printf函数。