비그래픽 문자와 인쇄할 수 없는 문자의 차이점

비그래픽 문자와 인쇄할 수 없는 문자의 차이점

내 시스템:

  • 우분투 22.04.3 LTS
  • GNU bash, 버전 5.1.16(1)-릴리스(x86_64-pc-linux-gnu)

man ls-b다음과 같이 설명됩니다 .

   -b, --escape
          print C-style escapes for nongraphic characters

이것"제어 문자"에 대한 Wikipedia 페이지상태:

제어 문자 또는 NPC(비인쇄 문자)는 쓰여진 문자나 기호를 나타내지 않는 문자 세트의 코드 포인트입니다. 다른 모든 문자는 "공백" 문자를 제외하고 주로 인쇄 문자(또는 인쇄 가능한 문자)라고도 하는 그래픽 문자입니다.

이것은 모호합니다.

그래픽이 아닌 문자가 무엇인지, 이 용어가 인쇄되지 않는 문자와 어떻게 다른지 설명하는 권위 있는 출처는 어디입니까?

답변1

이것그래픽 문자될 것이다isgraph()/iswgraph()표준 함수는 true 또는 정규식과 일치하는 값 [[:graph:]], 즉 graph로케일의 문자 클래스 값을 반환합니다.

모든POSIX, 클래스는 print상위 집합이어야 하고 graph분리되어야 cntrl하며 graph상위 집합이어야 하며 공백(u+0020) 문자를 포함해서는 안 됩니다(다른 공백 문자는 언급되지 않음).upperloweralphadigitxdigitpunct

아이디어는비유적인문자는 잉크로 그린 문자이며,인쇄 가능비컨트롤러가 됩니다.

실제로 GNU 시스템(예: Ubuntu)에서는 적어도 클래스에 비제어 문자를 print추가합니다 . 이는 glibc 2.35(Ubuntu 22.04에서 사용됨)와 다음을 포함하는 UTF-8 로케일을 사용합니다.graphspace

U+0020 SPACE
U+1680 OGHAM SPACE MARK
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE

space수업에는 다음이 있지만

U+0009 CHARACTER TABULATION
U+000A LINE FEED
U+000B LINE TABULATION
U+000C FORM FEED
U+000D CARRIAGE RETURN
U+0020 SPACE
U+1680 OGHAM SPACE MARK
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE

답변2

이 Bash 스크립트는 ASCII 세트의 각 문자와 관련된 문자 클래스(GNU/awk로 정의됨)를 나열합니다.

#! /bin/bash --

Awk='
BEGIN {
    Ctl1 = "SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI ";
    Ctl2 = "DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US SPACE";
    split (Ctl1 Ctl2, Ctl); Ctl[0] = "NUL"; Ctl[127] = "DEL";
    C = "cntrl print graph space blank punct alnum alpha digit lower upper xdigit";
    split (C, Class); 
}
function Char (n, ch, Local, j) {

    printf ("0x%.2X  %5s", n, (n <= 32 || n == 127) ? Ctl[n] : ch);
    for (j = 1; j in Class; ++j) 
        if (ch ~ "[[:" Class[j] ":]]") printf ("  :%s:", Class[j]);
    printf ("\n");
}
{ for (j = 0; j < 128; j++) Char( j, sprintf ("%c", j)); }
'
    echo | awk -f <( printf '%s' "${Awk}" ) 
    

관련 정보