为什么 awk 的 printf 将大于 127 的字符值解释为多字节字符?

Sam*_*Sam 2 awk ascii unicode

ASCII 字符范围是从 0 到 127,在该范围内,awk 的带有 %c 格式说明符的 printf 输出一个字节的数据:

$ awk 'BEGIN{printf "%c", 97}'
a

$ awk 'BEGIN{printf "%c", 127}' | xxd
00000000: 7f

$ awk 'BEGIN{printf "%c", 127}' | xxd -b
00000000: 01111111
Run Code Online (Sandbox Code Playgroud)

但对于大于 127 的值,它将打印出多个字节:

$ awk 'BEGIN{printf "%c", 128}' | xxd
00000000: c280

$ awk 'BEGIN{printf "%c", 128}' | xxd -b
00000000: 11000010 10000000
Run Code Online (Sandbox Code Playgroud)

0xc280 的意义是什么?为什么 awk 输出该字符而不是 0x80?

Ste*_*itt 7

这是UTF-8编码。11000010 开始一个双字节序列(前两位设置后跟一个清零位),有效位为 00010000000(第一个字节的最后五位,第二个字节的最后六位),即 128 。

AWK 输出此内容是因为您的语言环境设置为使用 UTF-8;您可以切换到非 UTF-8 语言环境来查看差异:

$ LC_ALL=C awk 'BEGIN{printf "%c", 128}' | xxd -b
00000000: 10000000
Run Code Online (Sandbox Code Playgroud)