我有一个Linux系统和Windows系统互相发送文本,他们每个人都用接收到的文本更新一个文本文件,现在当文本包含LF/CR char时出现问题,我需要统一发送的换行符他们俩,我都尝试只使用 \n (在发送字符串之前用空字符串替换 \r )但它不起作用,是否有针对此问题的已知解决方案?
2 回答
不要统一,只需在每个环境中适应它,就像 Git 一样。
从 Windows 发送到 Linux 时,将 \r\n "CRLF" 替换为 \n "LF",反之亦然,从 Linux 发送到 Windows 时,将 \n 转换为 \r\n。
如何跨不同平台处理换行符
这取决于平台和标准,但我发现的最佳经验法则是:在阅读期间处理所有这些;并根据标准或主机平台约定编写。
早期的 RFC,如电子邮件、隐私增强型电子邮件 (PEM)、Telnet 等,使用了'\r\n'
又名 Windows 行尾。所以所有的 Unix、OS X 和 Linux 系统都应该能够处理它们。
一些 RFC 说要以特定格式编写。如果是这种情况,那么您就按照标准所说的去做。例如,Telnet 和电子邮件 RFC 说软件将编写'\r\n'
. 作为另一个示例,SSH 文件格式 RFC 要求以主机格式写入。因此,Windows 上的软件写入'\r\n'
、Linux 上的写入'\n'
和 OS X 上的写入'\r'
。
在没有标准的情况下编写平台的原生格式。Windows 上的软件写入'\r\n'
、Linux 上的写入'\n'
和 OS X 上的写入'\r'
。而且由于您的经验法则 - 阅读所有格式 - 接收软件应该能够解析它。
我知道您不能信任某些标准库和运行时,因此您可能需要编写自己的readline
贪婪匹配函数\r\n
。可悲的是,Linux 上的 C++ 运行时就是这种情况。在 Linux 中的 C++ 程序中,C++ 运行时会将其视为一行,而不是两行:Hello\rWorld\n
. 如果您搜索 .Grep 也将落在它的脸上\r$
。