od 如何處理x7f
之後的符號?
以下命令從to傳遞給
od
符號:\x00``\xff
$ seq 0 255 | awk '{printf("%c", $0)}' | od -c
但我得到的是:
0000000 \0 001 002 003 004 005 006 \a \b \t \n \v \f \r 016 017 0000020 020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037 0000040 ! " # $ % & ' ( ) * + , - . / 0000060 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 0000100 @ A B C D E F G H I J K L M N O 0000120 P Q R S T U V W X Y Z [ \ ] ^ _ 0000140 ` a b c d e f g h i j k l m n o 0000160 p q r s t u v w x y z { | } ~ 177 0000200 302 200 302 201 302 202 302 203 302 204 302 205 302 206 302 207 0000220 302 210 302 211 302 212 302 213 302 214 302 215 302 216 302 217 0000240 302 220 302 221 302 222 302 223 302 224 302 225 302 226 302 227 0000260 302 230 302 231 302 232 302 233 302 234 302 235 302 236 302 237 0000300 302 240 302 241 302 242 302 243 302 244 302 245 302 246 302 247 0000320 302 250 302 251 302 252 302 253 302 254 302 255 302 256 302 257 0000340 302 260 302 261 302 262 302 263 302 264 302 265 302 266 302 267 0000360 302 270 302 271 302 272 302 273 302 274 302 275 302 276 302 277 0000400 303 200 303 201 303 202 303 203 303 204 303 205 303 206 303 207 0000420 303 210 303 211 303 212 303 213 303 214 303 215 303 216 303 217 0000440 303 220 303 221 303 222 303 223 303 224 303 225 303 226 303 227 0000460 303 230 303 231 303 232 303 233 303 234 303 235 303 236 303 237 0000500 303 240 303 241 303 242 303 243 303 244 303 245 303 246 303 247 0000520 303 250 303 251 303 252 303 253 303 254 303 255 303 256 303 257 0000540 303 260 303 261 303 262 303 263 303 264 303 265 303 266 303 267 0000560 303 270 303 271 303 272 303 273 303 274 303 275 303 276 303 277 0000600
後面的字元有什麼問題
\x7f
?
根據
awk
實現,printf("%c", n)
輸出字節值n
,或程式碼點為 的字元n
。如果語言環境的字元集是 UTF-8(參見 的輸出
locale charmap
),則對於 0 到 127 的值(其中字元 U+0000 到 U+007f 的編碼是字節值 0 到 0x7f)產生相同的結果。但是對於超過 127 的任何內容,您將獲得第一類實現的相應字節值(截斷為 8 位)
awk
,或者其他類別的實現的 UTF-8 編碼(至少 GNUawk
,可能是您正在使用的那個)。gawk 'BEGIN{printf "%c", 8364}'
(8364 是 0x20AC) 列印一個
€
歐元符號 (U+20AC),在 UTF-8 中編碼為 0xe2 0x82 0xac,而mawk 'BEGIN{printf "%c", 8364}'
列印一個 0xAC 字節(這是 UTF-8 中沒有字元的編碼,這是無效的文本,您的終端可能會將其呈現為
�
替換字元)。請注意,這裡的程式碼點通常是多字節字元集的 Unicode 程式碼點,以及單字節字元集的字元集值(即字節值)。在使用 iso8859-15 字元集的語言環境中,歐元符號的程式碼點為 0xA4(不是 0x20AC),
printf("%c", 0xA4)
無論實現如何,都會列印一個歐元符號(字節值 0xA4)awk
。因此,如果您想按值列印字節(值從 1 到 255,並非所有
awk
實現都適用於 0),請使用:LC_ALL=C awk 'BEGIN{printf "%c", value}'
C 語言環境的字元集保證為單字節,並且每個系統都有一個 C 語言環境。
您還可以使用:
printf '\200'
(這裡字節值用八進製表示)。一些
printf
實現還支持十六進制:printf '\x80'
一些
printf
實現還支持:printf '\u20ac'
根據其 Unicode 程式碼點列印字元(通常在語言環境的字元集中(因此 iso8859-15 語言環境中的 0xA4,UTF-8 語言環境中的 0xe2 0x82 0xac,以及字元集沒有歐元符號的語言環境中的各種不同行為) ),儘管有些像
printf
內置的ksh93
輸出,它以 UTF-8 編碼,而與語言環境的字元集無關)。