文件/组/记录/单元分隔控制字符及其用途是什么?

59

Unicode定义了几个ASCII控制字符。 http://www.unicode.org/charts/PDF/U0000.pdf

我看到很多控制字符被广泛使用,但我真的不知道“信息分隔符”在哪里使用。(U+001C~U+001F)

它们是什么?它们的历史是什么?它们用于什么?

Unicode 定义了多个 ASCII 控制字符,其中包括 U+001C ~ U+001F 的信息分隔符。虽然许多控制字符被广泛使用,但是信息分隔符的使用相对较少。这些字符最初设计用于打印机通信中,以标识文本流的开始和结束,或者表示需要在页面上进行特殊处理的内容。目前,信息分隔符仍然可以在一些通信协议和文件格式中找到,但它们的使用已经大大减少。

2
字段和记录分隔符可用于将表格数据编组为字符串。这有点过时,但它能够正常工作。 - The Nail
7
谢谢您的提问。我现在完全打算使用单元分隔符来代替制表符或逗号分隔文本。 - bugloaf
2
顺便提一下,Unicode实际上定义了US-ASCII的所有128个字符,而不仅仅是一些控制字符。Unicode是US-ASCII的超集。 - Basil Bourque
4个回答

71

Lammert Bies 解释了它们的用法和背后的历史。

28 - FS - 文件分隔符 文件分隔符FS是一个有趣的控制码,它让我们了解到计算机技术在六十年代是如何组织的。我们现在习惯了像RAM和磁盘这样的随机访问媒体,但在ASCII标准定义时,大多数数据都是串行的。我不仅指的是串行通信,还包括串行存储,如穿孔卡片、纸带和磁带。在这种情况下,拥有一个单一的控制码来表示两个文件的分隔是非常高效的。FS就是为此目的而定义的。
29 - GS - 组分隔符 数据存储是一些控制码被纳入ASCII定义的主要原因之一。数据库通常是由包含记录的表来设置的。一个表中的所有记录都具有相同的类型,但不同表的记录可以是不同的。组分隔符GS被定义为在串行数据存储系统中分隔表。请注意,在那个时候并没有使用“表”这个词,ASCII的人们称之为“组”。
30 - RS - 记录分隔符 在一个组(或表)中,记录是用RS或记录分隔符分隔的。
31 - US - 单元分隔符 在ASCII定义中,存储在数据库中的最小数据项被称为单元。现在我们称之为字段。单元分隔符用于在串行数据存储环境中分隔这些字段。大多数当前的数据库实现要求大多数类型的字段具有固定长度。记录中分配了足够的空间来存储每个字段的最大可能成员,即使在大多数情况下这是不必要的。在许多情况下,这将占用大量的空间。US控制码允许所有字段具有可变长度。如果数据存储空间有限(如在六十年代),这是保留宝贵空间的好方法。另一方面,串行存储远不如现代的基于表的RAM和磁盘实现高效。我无法想象现代SQL数据库在纸带或磁带上存储数据的情况...
一个单元分隔符可以实现与CSV文件中的逗号或制表符分隔文件中的制表符相同的功能。

28
得知CSV和TSV文件格式是基于缺乏ASCII知识而设计的,有点令人沮丧。 - Dag Høidahl
6
CSV使用逗号,但这是可打印字符。所有控制码均被视为不可打印,并因此是二进制数据 - 即使大多数是人类可读的。因此有一个小差别。 - Chris Uzdavinis
7
回复: “所有控制码都被认为是不可打印的” - 以它们的ASCII形式,确实如此。但是,正如我今天发现的那样,Unicode也有表示这些控制码的可打印字符:␜ ␝ ␞ ␟。 - Rounin

11
你的意思是大多数控制字符现在通常使用吗?这些控制字符主要与设备控制功能有关,但其中一些可能已被用作文本文件中的分隔符。如果需要快速参考,请查看我的C0控件表格
信息分隔符已被用于以简单的方式对数据进行分组,但如今,二进制格式或XML格式用于数据组织。仍然存在奇怪的情况,例如Microsoft Word中内部使用U+001E和U+001F来实现程序自己的“非断字连字符”和“可选连字符”概念(与Unicode字符用于类似目的相反)。这主要说明程序可以以奇怪的方式使用控制字符。当然,如果这些字符包含在传输给其他程序的文本中,则会出现问题。

抱歉我的英语不好。我更新了我的问题以使其更清晰。 - eonil

4

它们的功能是故意模糊的。来自字符编码开发的标准参考资料(Mackenzie,Charles E. Coded-Character Sets: History and Development。Addison-Wesley Longman Publishing Co.,Inc.,1980.),第26章第1节,第460页:

在ASCII 7位码和EBCDIC中,额外设计了四个通用字符,称为信息分隔符。文件分隔符、组分隔符、记录分隔符和单元分隔符被广泛定义为用于分隔信息块。但是,如何使用它们来分隔块,应该使用什么样的文件和记录结构哲学,故意没有指定。这样详细的规范将留给分隔符将要使用的特定数据处理应用程序。最初,定义了一种层次结构的信息块结构哲学。一个“文件”比“组”大,并且会包含“组”。一个“组”比“记录”大,并且会包含“记录”。而一个“记录”比“单元”大,并且会包含“单元”。最终,标准委员会将此层次结构规范作为可选项;也就是说,不需要按照层次结构使用分隔符,但如果使用,则层次结构将如上所述。标准委员会意识到,与设备控制一样,信息分隔符的不确定性可能导致信息交换的困难,但这些困难在出现时可以解决。

一个使用此大纲层次结构的标准示例是ANSI/NIST-ITL标准,用于交换法医生物特征图像的已被取代版本。 ITL“传统编码”使用ASCII分隔符,如下所示:

␜ 文件分隔符 - 分隔逻辑记录。

␝ 组分隔符 - 分隔字段。

␞ 记录分隔符 - 分隔重复的子字段。

␟ 单元分隔符 - 分隔信息项。

这种用法可能与分隔符的命名目的相矛盾,但理解字符代码的预期层次结构使得ITL标准中的选择更加合适。

一种使用ASCII分隔控制码的数据格式的当前示例是JavaScript对象表示法(JSON)文本序列格式(RFC 7464,媒体类型application/json-seq),它在每个记录之前放置一个ASCII记录分隔符(0x1E)字符。


0
控制图片,显示对应物
其他答案是正确的。 ASCII(因此Unicode)将四个控制字符定义为分隔符。
此外,如Rounin的评论中所提到的,Unicode定义了另外四个字符,用作每个控制字符的可视表示。这些被称为控制图片
控制图片字符在显示包含任何这些控制字符的文本文件的文本编辑器中非常有用。在记录其控制字符对应物的使用时也很有用。
以下是控制字符及其显示对应物的代码点表。Unicode Consortium发布的Unicode 15.1的PDF文档是官方来源:

这些控制图片字符的字形代表了次要名称中的一对大写字母:

  • FS
  • GS
  • RS
  • US
主要名称 次要名称 代码点(十进制 十六进制) 控制图片名称 控制图片代码点(十进制 十六进制) 符号 信息分隔符四 文件分隔符(FS) 28 U+001C 文件分隔符符号 9,244 U+241C ␜ 信息分隔符三 组分隔符(GS) 29 U+001D 组分隔符符号 9,245 U+241D ␝ 信息分隔符二 记录分隔符(RS) 30 U+001E 记录分隔符符号 9,246 U+241E ␞ 信息分隔符一 单元分隔符(US) 31 U+001F 单元分隔符符号 9,247 U+241F ␟
作为控制字符,您无法直接输入它们。相反,您可以通过它们的分配的代码点整数值来实例化它们。例如,在Java中:
final String file_separator_FS = Character.toString( 28 ) ;
final String group_separator_GS = Character.toString( 29 ) ;
final String record_separator_RS = Character.toString( 30 ) ;
final String unit_separator_US = Character.toString( 31 ) ;

你可能也想对控制图片字符做同样的操作。
final String SYMBOL_FOR_FILE_SEPARATOR = Character.toString( 9_244 ) ;
final String SYMBOL_FOR_GROUP_SEPARATOR = Character.toString( 9_245 ) ;
final String SYMBOL_FOR_RECORD_SEPARATOR = Character.toString( 9_246 ) ;
final String SYMBOL_FOR_UNIT_SEPARATOR = Character.toString( 9_247 ) ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接