在Java规范中,我读到作为与某些操作系统兼容的特殊让步,如果ASCII SUB字符(\u001a或control-Z)是转义输入流中的最后一个字符,则忽略该字符。这里我不明白转义字符是什么,为什么它应该被删除/忽略如果它是转义输入流中的最后一个字符有人能帮我理解吗?非常感谢
xqk2d5yq1#
Windows中的Ctrl+Z控制代码比较特殊,它继承自DOS,而DOS又继承自CP/M。它的传统用途是作为文本结束标记,类似于Unix中使用Ctrl+D的方式。它被作为不可打印字符包含在Unicode中,以匹配现有的ASCII字符0x 1A。许多文本编辑器和程序语言仍然支持这种约定,或者可以配置为在编辑时在文件末尾插入此字符。CSV文件的标准规范仍然建议在文件的最后一个字符后追加一个尾随字符。参见https://en.wikipedia.org/wiki/Substitute_character因为你永远不会在任何其他地方遇到这个字符,特别是在一个转义的输入流中,在那里只应该出现可打印的字符,这个字符可以安全地在任何地方被忽略。实际上,只有当它是转义输入流中的最后一个字符时才会被忽略。所以如果你在你的源代码中间放一个Ctrl-Z,例如。作为变量名的一部分,你会得到一个编译器错误。但是,如果你在一些古老的文本编辑器中编写代码,在文件的末尾放置Ctrl-Z,编译器将安全地忽略它。
2exbekwf2#
显然ASCII SUB was traditionally used in some old operating systems to indicate the end of a file或字符流的结尾(即用户关闭终端)。然而,这不是你在任何最近的系统中都会看到的。这可能是Java从其第一版继承的一条规则,它存在的目的是在编译遵循该约定编写的源代码时防止无意义和可预防的错误。例如,这些操作系统中的一个文本编辑器可能会默认将该字符写入文件的末尾,Java编译器应该编译该文件,即使该字符存在。
tl;dr这是一个遗留规则,以支持古老的操作系统,今天删除它不太可能会导致任何重大问题。
2条答案
按热度按时间xqk2d5yq1#
Windows中的Ctrl+Z控制代码比较特殊,它继承自DOS,而DOS又继承自CP/M。它的传统用途是作为文本结束标记,类似于Unix中使用Ctrl+D的方式。
它被作为不可打印字符包含在Unicode中,以匹配现有的ASCII字符0x 1A。
许多文本编辑器和程序语言仍然支持这种约定,或者可以配置为在编辑时在文件末尾插入此字符。CSV文件的标准规范仍然建议在文件的最后一个字符后追加一个尾随字符。
参见https://en.wikipedia.org/wiki/Substitute_character
因为你永远不会在任何其他地方遇到这个字符,特别是在一个转义的输入流中,在那里只应该出现可打印的字符,这个字符可以安全地在任何地方被忽略。实际上,只有当它是转义输入流中的最后一个字符时才会被忽略。
所以如果你在你的源代码中间放一个Ctrl-Z,例如。作为变量名的一部分,你会得到一个编译器错误。但是,如果你在一些古老的文本编辑器中编写代码,在文件的末尾放置Ctrl-Z,编译器将安全地忽略它。
2exbekwf2#
显然ASCII SUB was traditionally used in some old operating systems to indicate the end of a file或字符流的结尾(即用户关闭终端)。
然而,这不是你在任何最近的系统中都会看到的。这可能是Java从其第一版继承的一条规则,它存在的目的是在编译遵循该约定编写的源代码时防止无意义和可预防的错误。
例如,这些操作系统中的一个文本编辑器可能会默认将该字符写入文件的末尾,Java编译器应该编译该文件,即使该字符存在。
tl;dr这是一个遗留规则,以支持古老的操作系统,今天删除它不太可能会导致任何重大问题。