填充的 printf 格式字符串没有使用多字节字符添加足够的填充

use*_*816 6 bash shell printf

我经常在 shell 脚本中使用 printf 来制作一些漂亮的对齐输出

问题是,每次打印的字符串中出现重音 (éèà) 时,它都会将后面的字符串向后移动 1 步。

例子 :

printf "%-10s %s\n" "toto" "test"
printf "%-10s %s\n" "titi" "test"
printf "%-10s %s\n" "tété" "test"
printf "%-10s %s\n" "toto" "test"
Run Code Online (Sandbox Code Playgroud)

预期的 :

toto       test
titi       test
tété       test
toto       test
Run Code Online (Sandbox Code Playgroud)

得到了 :

toto       test
titi       test
tété     test
toto       test
Run Code Online (Sandbox Code Playgroud)

有人对此有解释吗,我该怎么做才能使 printf 正确处理特殊字符?

感谢您的帮助

Kam*_*Cuk 5

有人对此有解释吗

é用两个字节编码的字符

我该怎么做才能使 printf 正确处理特殊字符?

设计自己的填充方法,将 utf-8s 考虑在内。理想情况下,我相信像wprintf或进行%Ls格式说明符调用wcwidth()以确定字符宽度或类似的东西的工具会受到欢迎和有用。

到目前为止,至少我的 bash 在计算字符串长度时会考虑 utf-8 字符。您可以自己插入填充:

printf "%-10s %s\n" "titi" "test";
s="tété";
# (echo -n "$s" | wc -c) is 6 , but ${#s} is 4!
printf "%s%*s %s\n" "$s" "$((10-${#s}))" "" "test"
Run Code Online (Sandbox Code Playgroud)