【问题标题】:How to deal with newline char across different platforms如何跨不同平台处理换行符
【发布时间】:2013-06-19 13:25:05
【问题描述】:

我有一个Linux系统和Windows系统互相发送文本,他们每个人都用接收到的文本更新一个文本文件,现在当文本包含LF/CR char时我遇到了问题,我需要统一换行符他们俩发送的字符,我尝试仅使用 \n (在发送字符串之前将 \r 替换为空字符串)但它不起作用,是否有针对此问题的已知解决方案?

【问题讨论】:

    标签: cross-platform newline communication text-editor


    【解决方案1】:

    不要统一,只需像 Git 那样在每个环境中适应它。

    当从 Windows 发送到 Linux 时,将 \r\n "CRLF" 替换为 \n "LF",反之亦然,当从 Linux 发送到 Windows 时,将 \n 转换为 \r\n。

    【讨论】:

    • 问题是我需要文档具有与我使用字符偏移量相同的长度和字符数
    【解决方案2】:

    如何跨平台处理换行符

    这取决于平台和标准,但我发现的最佳经验法则是:在阅读期间处理所有这些;并根据标准或主机平台约定编写。

    早期的 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 也会掉头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2016-06-09
      • 2010-11-24
      • 2010-09-12
      • 2021-06-13
      • 2012-02-23
      • 2012-07-14
      相关资源
      最近更新 更多