在awk内更改sprintf的区域设置(LC_ALL)

在awk内更改sprintf的区域设置(LC_ALL),awk,locale,Awk,Locale,我想使用sprintf(“%c”)将129到255范围内的整数值打印成字符串,但“GNU Awk用户指南”中提到的以下语句有问题: 注意:POSIX标准说字符串的第一个字符是 印刷的。在具有多字节字符的区域设置中,gawk尝试 将字符串的前导字节转换为有效的宽字符 然后打印该字符的多字节编码。同样地, 打印数值时,gawk允许该值在 可保存在宽字符中的数值范围。如果 转换为多字节编码失败,gawk使用低8位 作为要打印的字符的值 这将导致以下输出: [:~]$ gawk 'BEGIN {retS

我想使用sprintf(“%c”)将129到255范围内的整数值打印成字符串,但“GNU Awk用户指南”中提到的以下语句有问题:

注意:POSIX标准说字符串的第一个字符是 印刷的。在具有多字节字符的区域设置中,gawk尝试 将字符串的前导字节转换为有效的宽字符 然后打印该字符的多字节编码。同样地, 打印数值时,gawk允许该值在 可保存在宽字符中的数值范围。如果 转换为多字节编码失败,gawk使用低8位 作为要打印的字符的值

这将导致以下输出:

[:~]$ gawk 'BEGIN {retString = sprintf("%c%c%c", 129, 130, 131); print retString}' | od -x
0000000 81c2 82c2 83c2 000a
在每个字节(0x81、0x82、0x82)的前面添加一个额外的字节(0xc2)。我可以通过将LC_ALL设置为C来避免这种情况:

[:~]$ LC_ALL=C gawk 'BEGIN {retString = sprintf("%c%c%c", 129, 130, 131); print retString}' | od -x
0000000 8281 0a83
现在的问题是:如何在不将LC_ALL设置在awk脚本之外的情况下在awk中更改区域设置?我希望在多个系统上使用此脚本,并且不希望输出取决于默认的区域设置


或者有没有其他方法可以在不使用sprintf()调用的情况下获得相同的结果?

我认为最简单的方法是创建一个包装器脚本

$ cat cawk
LC_ALL=C gawk "$@"
并使其可执行

$ chmod +x cawk
它的工作原理类似于
gawk

$ ./cawk -v a=42 'BEGIN {print a}'
42