【发布时间】:2013-06-19 13:25:05
【问题描述】:
我有一个Linux系统和Windows系统互相发送文本,他们每个人都用接收到的文本更新一个文本文件,现在当文本包含LF/CR char时我遇到了问题,我需要统一换行符他们俩发送的字符,我尝试仅使用 \n (在发送字符串之前将 \r 替换为空字符串)但它不起作用,是否有针对此问题的已知解决方案?
【问题讨论】:
标签: cross-platform newline communication text-editor
我有一个Linux系统和Windows系统互相发送文本,他们每个人都用接收到的文本更新一个文本文件,现在当文本包含LF/CR char时我遇到了问题,我需要统一换行符他们俩发送的字符,我尝试仅使用 \n (在发送字符串之前将 \r 替换为空字符串)但它不起作用,是否有针对此问题的已知解决方案?
【问题讨论】:
标签: cross-platform newline communication text-editor
不要统一,只需像 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。如果你搜索\r$,Grep 也会掉头。
【讨论】: