awkのprintfが127より大きい文字値をマルチバイト文字として解釈するのはなぜですか?

awkのprintfが127より大きい文字値をマルチバイト文字として解釈するのはなぜですか?

ASCII文字の範囲は0から127です。この範囲内で、%c書式指定子を使用するawkのprintfは、1バイトのデータを出力します。

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

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

$ awk 'BEGIN{printf "%c", 127}' | xxd -b
00000000: 01111111

ただし、127より大きい値の場合は、複数バイトを印刷します。

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

$ awk 'BEGIN{printf "%c", 128}' | xxd -b
00000000: 11000010 10000000

0xc280の意味は何ですか? awkが0x80の代わりにこの文字を出力するのはなぜですか?

ベストアンサー1

これはUTF-8コーディング。 11000010は2バイトシーケンスを開始し(最初の2ビットはクリアビットに設定されます)、有効なビットは00010000000(最初のバイトの最後の5ビット、2番目のバイトの最後の6ビット)です。これは128です。 。

AWKはロケールがUTF-8を使用するように設定されているため、それを出力します。 UTF-8以外のロケールに切り替えることで、違いを確認できます。

$ LC_ALL=C awk 'BEGIN{printf "%c", 128}' | xxd -b
00000000: 10000000

おすすめ記事