ASCII不可读字符28、29、31。

11

我正在处理一个文件,需要基于分隔符进行拆分。

以下代码显示了我正在处理的文件所定义的分隔符。

private static final String    component   = Character.toString((char) 31);
private static final String    data        = Character.toString((char) 29);
private static final String    segment     = Character.toString((char) 28);

请问这些特定分隔符的重要性是什么?

查看ASCII码,这些分隔符是文件、组和单元分隔符。我不太理解这意味着什么。

3个回答

34

这里发现一个很酷的网站!

28 – FS – 文件分隔符 文件分隔符FS是一个有趣的控制码,因为它让我们了解了计算机技术在60年代是如何组织的。我们现在习惯于像RAM和磁盘这样的随机访问存储介质,但当ASCII标准被定义时,大多数数据都是串行的。我不仅在谈论串行通信,还包括纸带和磁带等串行存储。在这种情况下,有一个单一的控制码来表示两个文件的分隔是非常有效的。FS就是为此目的而定义的。

29 – GS – 组分隔符 数据存储是一些控制码加入ASCII定义的主要原因之一。数据库大多是用表格来设置的,其中包含记录。同一张表中的所有记录具有相同的类型,但不同表中的记录可以不同。 组分隔符GS被定义为在串行数据存储系统中分隔表(或组)。

30 – RS – 记录分隔符 在一个组(或表)内,记录使用记录分隔符RS来分隔。

31 – US – 单元分隔符 ASCII定义中,存储在数据库中的最小数据项称为单元。我们现在称之为字段。单元分隔符将这些字段分隔在串行数据存储环境中。大多数当前的数据库实现要求大多数类型的字段具有固定长度。即使在大多数情况下不需要这样做,仍然在记录中分配足够的空间来存储每个字段的最大可能成员。在许多情况下,这将耗费大量空间。US控制码允许所有字段具有可变长度。如果数据存储空间有限-就像在六十年代一样,这是保留宝贵空间的好方法。另一方面,串行存储远不如基于表格的RAM和磁盘实现高效。我无法想象一个现代数据库还使用串行存储。

情况是现代SQL数据库运行在数据存储在纸带或磁带上的情况下。

3
我更喜欢这个答案!它省去了我阅读很多额外内容,直接回答了问题。 - talkaboutquality
尽管只需添加所选答案中给出的十进制ASCII代码即可受益。此外,由于我来这里是为了帮助我从保存在聊天应用程序中的文本文件中摆脱这些代码,因此提供十六进制代码也很好:1C、1D和1F。关于如何编写正则表达式,请参见此处:https://dev59.com/OnA75IYBdhLWcg3wm6Yj - talkaboutquality

3

ASCII 控制字符范围从 28 到 31(0x1C 到 0x1F)。

31 Unit Separator
30 Record Separator
29 Group Separator
28 File Separator

示例调用:

char record_separator = 0x1F;
String s = "hello" + record_separator + "world"

1

这些字符是控制字符。它们不是为人类编写或阅读的,而是为计算机编写或阅读的。在程序中,您应该像对待其他字符一样处理它们。


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