非グラフィック文字と印刷できない文字の違い

非グラフィック文字と印刷できない文字の違い

私のシステム:

  • Ubuntu 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

これ「制御文字」のウィキペディアページ状態:

制御文字またはNPC(非印刷文字)は、書かれた文字や記号を表さない文字セットのコードポイントです。他のすべての文字は、「空白」文字を除いて、主に印刷文字(または印刷可能文字)とも呼ばれるグラフィック文字です。

これはあいまいです。

グラフィックではない文字が何であるか、この用語が印刷されていない文字とどのように異なるかを説明する権威あるソースはどこですか?

答え1

これグラフィック文字なりますisgraph()/iswgraph()標準関数は、trueまたは正規表現に一致する値[[:graph:]]、つまりgraphロケールの文字クラス値を返します。

すべてPOSIX、クラスはprint親セットでなければならず、分離しなければならgraphcntrlgraph親セットでなければならず、空白(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}" ) 
    

関連情報