4

我需要一个特定的描述(一个不会被正则表达式等东西混淆的描述),用于一个可以计算混合换行符的源文件的算法:

'\r', '\n', '\r\n', '\n\r'

我目前有以下算法。好吗?:

  1. 我确保始终位于第一个换行符类型的“边界”上。

  2. 在那个事件中,我比较了当前的字节字符。

3.1。如果是'\n',我算作结束当前行并开始新行。

3.2. 如果是'\r',我读取下一个字符(如果没有超出文本缓冲区的限制)并查看它是否是'\n'。如果是,我将其视为 '\r\n' 换行符。

3.3. 如果是'\r',并且下一个字符不是'\n',我把它算作'\r'产生的换行符;将当前行标记为结束并将其计为新行的开始。


如果它有用,我需要它来尝试对跨 Web 浏览器复制/粘贴的源文件和/或从具有不同类型换行符的多个文件附加的源文件产生更大的“可移植性”,并且我有我想要的解析工具以确保在所有情况下都具有正确且稳健的行为。

4

1 回答 1

2

该算法应涵盖所有情况的 99.999%。

您可能应该以二进制模式而不是文本模式阅读源代码,以确保没有 I/O 层试图通过将其中一些转换为'\n'.

您没有指定您正在使用哪种语言。请注意,在 C 和 C++ 中,'\n'它与其他转义字符不同,因为它不能保证具有特定值。的确,在大多数实现中,它将映射到 ASCII 换行符,但使用诸如'\x0A'保持代码可移植性之类的东西更安全、更明确。

还有一些其他的换行方案,但它们非常罕见。Unicode 中有一个NEL字符,用于与最初在 EBCDIC 中的文件(我认为)进行往返兼容。Unicode 还引入了LINE SEPARATORPARAGRAPH SEPARATOR,您可能也希望将它们视为换行符。但是这些非常罕见并且处理起来很复杂,因为它们超出了 ASCII 范围,因此您需要了解您的编码并准备好处理这些问题。

于 2012-04-12T00:08:55.360 回答