od는 `\x7f` 뒤의 기호를 어떻게 처리합니까?

od는 `\x7f` 뒤의 기호를 어떻게 처리합니까?

다음 명령은 from 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?

답변1

awk구현 에 따라 printf("%c", n)출력 바이트 값 n또는 코드 포인트는 문자입니다 n.

로케일의 문자 집합이 UTF-8(출력 참조 locale charmap)인 경우 0~127 값에 대해 동일한 결과가 생성됩니다(여기서 문자 U+0000~U+007f는 바이트 값 0~0x7f로 인코딩됨).

awk그러나 127을 초과하는 경우 첫 번째 범주 구현의 해당 바이트 값(8비트로 잘림)을 얻거나 다른 범주 구현의 UTF-8 인코딩(적어도 GNU awk, 아마도 여러분이 원하는 것일 것입니다)을 얻습니다. )을 다시 사용하고 있습니다.

gawk 'BEGIN{printf "%c", 8364}'

(8364는 0x20AC) 는 UTF-8로 0xe2 0x82 0xac로 인코딩된 유로 기호(U+20AC)를 인쇄합니다.

mawk 'BEGIN{printf "%c", 8364}'

0xAC 바이트를 인쇄합니다(이것은 문자가 없는 UTF-8 인코딩으로, 잘못된 텍스트이며 터미널에서 대체 문자로 렌더링될 수 있습니다).

알아채다코드 포인트이는 일반적으로 멀티바이트 문자 세트의 경우 유니코드 코드 포인트이고, 싱글바이트 문자 세트의 경우 문자 세트 값(즉, 바이트 값)입니다. iso8859-15 문자 세트를 사용하는 로케일에서 유로 기호의 코드 포인트는 0xA4(0x20AC 아님)이며 printf("%c", 0xA4)유로 기호(바이트 값 0xA4)는 구현에 관계없이 인쇄됩니다 awk.

awk따라서 값(1에서 255 사이의 값, 모든 구현이 0에서 올바르게 작동하는 것은 아님)으로 바이트를 인쇄하려면 다음을 사용하십시오.

LC_ALL=C awk 'BEGIN{printf "%c", value}'

C 로캘의 문자 집합은 단일 바이트가 보장되며 모든 시스템에 대해 C 로캘이 있습니다.

다음을 사용할 수도 있습니다.

printf '\200'

(여기서 바이트 값은 8진수로 표현됩니다.) 일부 printf구현에서는 16진수도 지원합니다.

printf '\x80'

일부 printf구현에서는 다음도 지원합니다.

printf '\u20ac'

유니코드 코드 포인트(일반적으로 로케일의 문자 세트)에 따라 문자를 인쇄합니다(따라서 iso8859-15 로케일에서는 0xA4, UTF-8 로케일에서는 0xe2 0x82 0xac, 문자 세트에 유로 기호가 없는 로케일). , 일부 사람들은 로케일의 문자 세트에 관계없이 printf내장 출력이 UTF-8로 인코딩되는 것을 선호합니다.ksh93

관련 정보