大多数 ASCII 控制字符是否已过时?

Are most of the ASCII control characters obsolete?

\x20 下的大多数 ASCII 代码似乎已完全过时。它们今天被使用了吗?它们可以被考虑 "up for grabs",还是最好避免它们?

我需要一个分隔符来将 "lines" 分组在一起,为此目的选择其中一个肯定会很好。

来自man ascii

    Oct   Dec   Hex   Char                        
    ----------------------------------------------
    000   0     00    NUL '[=10=]'                    
    001   1     01    SOH (start of heading)      
    002   2     02    STX (start of text)         
    003   3     03    ETX (end of text)           
    004   4     04    EOT (end of transmission)   
    005   5     05    ENQ (enquiry)               
    006   6     06    ACK (acknowledge)           
    007   7     07    BEL '\a' (bell)             
    010   8     08    BS  '\b' (backspace)        
    011   9     09    HT  '\t' (horizontal tab)   
    012   10    0A    LF  '\n' (new line)         
    013   11    0B    VT  '\v' (vertical tab)     
    014   12    0C    FF  '\f' (form feed)        
    015   13    0D    CR  '\r' (carriage ret)     
    016   14    0E    SO  (shift out)             
    017   15    0F    SI  (shift in)              
    020   16    10    DLE (data link escape)      
    021   17    11    DC1 (device control 1)      
    022   18    12    DC2 (device control 2)      
    023   19    13    DC3 (device control 3)      
    024   20    14    DC4 (device control 4)      
    025   21    15    NAK (negative ack.)         
    026   22    16    SYN (synchronous idle)      
    027   23    17    ETB (end of trans. blk)     
    030   24    18    CAN (cancel)                
    031   25    19    EM  (end of medium)         
    032   26    1A    SUB (substitute)            
    033   27    1B    ESC (escape)                
    034   28    1C    FS  (file separator)        
    035   29    1D    GS  (group separator)       
    036   30    1E    RS  (record separator)      
    037   31    1F    US  (unit separator)        
    040   32    20    SPACE                       

首先是简单的部分:大多数现代系统都没有网络传输问题。当前的协议几乎可以将任何数据——无论是 7 位 ASCII、8 位 ASCII、Unicode 字符、图像数据还是编译程序——都作为二进制数据处理。情况并非总是如此。许多旧系统在传输控制代码和其他 "unprintable" 字符时遇到问题,尤其是 8 位数据时出现问题。但幸运的是,那些日子已经过去了。一个 例外是如果您希望能够通过 HTML 表单 copy/paste 数据 - 为此您想要省略所有控制代码和其他有趣的东西。

当然,您可以随意设置格式。然而,一些字符仍然被频繁使用:

000   0     00    NUL '[=10=]' - does "nothing" but is hard for some text editors to handle
003   3     03    ETX (end of text) - Control-C - "break" in a lot of systems
007   7     07    BEL '\a' (bell) - Still makes a bell sound.
011   9     09    HT  '\t' (horizontal tab) - A lot of text editors and file formats use this to set a fixed number of spaces
012   10    0A    LF  '\n' (new line) - like it says
015   13    0D    CR  '\r' (carriage ret) - used instead of, or together with \n on many systems
021   17    11    DC1 (device control 1) - Control-Q - Resume transmission - XON
023   19    13    DC3 (device control 3) - Control-S - Pause transmission - XOFF
033   27    1B    ESC (escape) - Used for PCL and other printer control codes and plenty of other things 

其他的都差不多了。我会特别避免 NUL 和 XON/XOFF - 它们有时很难输入文件 - 和 BEL 因为用 BEL 键入文件可能会很吵。

如果你有一个真正的二进制格式,那么你可以做任何你想做的事。但是,如果您想要一种大多数人可读的格式,那么限制控制代码是个好主意。

位模式——即数字化数值——不会过时。 ASCII 控制代码的标签反映了在各种上下文中的建议用途——串行通信、文本显示和打印、命令行编辑等。更好的文字处理器和文本编辑器在其键盘命令中使用了所有这些代码集,并允许将它们全部插入到文件中,自 1970 年代以来,甚至更早。此类程序小心不要将这些代码直接发送到屏幕;他们解释换行符和制表符,有时还解释其他内容,并以插入符符号(例如,SOH 的“^A”)或带下划线或括号的字符来象征性地显示其他所有内容。如果您担心用户会将您的文件显示在屏幕上,那么当然要避免使用 ESC 和上面提到的其他一些方法。否则,请随意使用它们。

很久以前,我修补了 WordStar,使其在需要时将我的点阵打印机置于图形模式。使用 WordStar,任何七位代码都可以放入图形数据中。工作得很好。

ASCII 控制代码并未过时。现在它们使用得不那么多了,因为使它们如此有用的技术不再是主流技术,因为通信技术(USB、以太网、WiFi、3G 和更高版本的蜂窝网络等)的技术改进以及集成技术的改进电路制造(每平方毫米的元件数量增加,CPU 架构改进,元件更小型化,例如片上系统)以及协议改进。

然而在物联网世界中,影响这些代码设计的相同技术考虑因素仍然适用:

  • RAM 和存储空间有限的小型处理器
  • 低速路径上的低带宽通信

有几种 ASCII 控制代码旨在用于构建文本。 Wikipedia topic C0 and C1 control codes, Basic ASCII control codes 描述了分隔符控制代码,FS(文件分隔符)、GS(组分隔符)、RS(记录分隔符)和美国单位分隔符。

Can be used as delimiters to mark fields of data structures. If used for hierarchical levels, US is the lowest level (dividing plain-text data items), while RS, GS, and FS are of increasing level to divide groups made up of items of the level beneath it. The Unix info format uses US, followed by an optional form-feed and a line break, to mark the beginning of a node.[14]

MARC 21 uses US as a subfield delimiter, RS as a field terminator and GS as a record terminator.[15]

In the current edition of IPTC 7901, if they are not used for other purposes, US is recommended for use as a column separator in tables, FS as a "Central Field Separator" in tables, and GS and RS respectively for marking a following space or hyphen-minus as non-breaking or soft respectively (in character sets not supplying explicit NBSP and SHY characters).2

另请参阅 RFC20, ASCII format for Network Interchange 中的描述,其中将 FS、GS、RS 和 US 描述为:

FS (File Separator), GS (Group Separator), RS (Record Separator), and US (Unit Separator): These information separators may be used within data in optional fashion, except that their hierarchical relationship shall be: FS is the most inclusive, then GS, then RS, and US is least inclusive. (The content and length of a File, Group, Record, or Unit are not specified.)

Wikipedia topic IPTC 7901 describes the use of control characters with news service messages beginning with the formal approval of the protocol in 1979 which sounds to be similar to an RSS feed protocol. The actual specification is available from the IPTC web site as The IPTC Recommended Message Format, 1995.