【问题标题】:Is a new line = \n OR \r\n?是换行 = \n 还是 \r\n?
【发布时间】:2011-01-28 03:39:02
【问题描述】:

我看到许多开发人员使用不同的方法将字符串换行,但我很困惑哪个是正确的:\r\n OR \n only?

【问题讨论】:

  • 我从未见过\n\r。如果他们使用两个,通常是\r\n
  • 这实际上取决于您正在处理的文件/字符串的格式。
  • 如果您想将本机系统 eol 字符嵌入到您的字符串中,可以使用 PHP_EOL 常量。但是,如果您要处理来自其他系统的文本,这无济于事。
  • 您可能会发现s($str)->normalizeLineEndings() 很有帮助,如this standalone library 中所示。这会将 all 换行符变成 \n,甚至是这个问题没有提到的 Unicode 换行符。

标签: php string


【解决方案1】:

\n 用于 Unix 系统(包括 Linux 和 OSX)。

\r\n主要用于Windows。

\r 用于非常旧的 Mac。

使用PHP_EOL 常量代替这些字符以实现平台之间的可移植性。

【讨论】:

  • \r 有时也用于当前的 Mac,具体取决于文本编辑器。不过,大多数纯文本编辑器已切换到 unix 样式。
  • 完全正确。对于那些不知道的人来说,更具体地说,使用\n 的“大多数 UNIX 系统”包括 Mac OS X。
  • 要明确一点:这里真正的旧 Mac 是指为 OS 9 编码的程序,它在 2002 年被宣布死亡。
  • 从历史的角度来看,从打印机只打印字符(如打字机)的日子开始。 \r 是回车(字面意思是将打印头移回行首),\n 是换行符(将纸张向上移动)。更多信息在这里:en.wikipedia.org/wiki/Carriage_return
  • 进一步考虑历史方面,为了打印“完整”换行符有两个字符的原因是因为打印头返回到行首需要时间,所以只需拥有另一个不需要打印头本身执行任何操作的角色,就可以让整个系统高效工作,而无需担心客户端必须等待然后在发送换行符后重新同步。
【解决方案2】:

给出的答案远未完成。事实上,它还远未完成,以至于它往往会导致读者相信这个答案是依赖于操作系统的,而实际上并非如此。它也不是依赖于编程语言的东西(正如一些评论员所建议的那样)。我将添加更多信息以使这一点更清楚。首先,让我们列出当前新的线路变化(例如,它们自 1999 年以来的变化):

  • \r\n 仅用于 Windows 记事本(自 2018 年起修复)、DOS 命令行(PowerShell 只能很好地处理 \n;以及大多数现代版本的 DOS 时代命令行应用程序[例如more])、大多数在 ~2000 年之前编写的 Windows API,以及一些(较旧的)Windows 应用程序(主要是因为它们使用 Windows API)。
  • .ps1.bat.cmd 脚本的 YMMV。
  • 奇怪的是,TCP/IP 使用\r\n。这意味着大多数 Web 协议(包括 HTTP 本身)都使用 \r\n,正如 Raatje 所指出的那样。作为一名 PHP 程序员,这对你来说肯定很重要。
  • \n 用于所有其他系统、应用程序和网页/电子邮件的内容。

您会注意到,我已将大多数 Windows 应用程序放在 \n 组中,这可能会引起一些争议,但在您不同意此声明之前,请获取一个 UNIX 格式的文本文件并在 10 个 Web 友好的 Windows 应用程序中试用您的选择(上面我的例外情况中没有列出)。他们中有多少人处理得很好?您会发现它们(实际上)都实现了行尾的自动检测或只使用\n,因为虽然Windows 可能使用\r\n,但Internet 和大多数其他操作系统只使用\n。因此,如果您希望输出对 Internet 友好,则应用程序最好单独使用 \n

PHP 还定义了一个名为PHP_EOL 的换行符。此常量设置为运行 PHP 的机器的操作系统特定换行符字符串(\r\n 用于 Windows,\n 用于其他所有内容)。这个常量对网页不是很有用,应该避免用于 HTML 输出或将大多数文本写入文件。当我们从 PHP 应用程序转移到命令行输出时,它变得非常有用,因为它允许您的应用程序在所有支持的操作系统中以一致的方式输出到终端窗口。

如果您希望您的 PHP 应用程序在它们所在的任何服务器上运行,要记住的最重要的两件事是您应该始终只使用\n,除非它是终端输出(在这种情况下您使用 PHP_EOL)并且您还应该始终使用/ 作为路径分隔符(而不是\)。第三件要注意的是路径字符串中的驱动器号(如果允许),这可能会很棘手,具体取决于您正在执行的操作。

更长的解释:

应用程序可以选择使用它喜欢的任何行尾,而不管默认的 OS 行尾样式。如果我希望我的文本编辑器在每次遇到不比使用\n 表示换行符更难的句点时打印一个换行符,因为无论如何我都在解释文本时显示它。 IOW,我正在摆弄测量每个字符的宽度,这样它就知道在哪里显示下一个字符,所以添加一个语句非常简单,如果当前字符是句点,则执行换行操作(或者如果它是\n 然后显示句号)。

除了空终止符之外,没有任何字符代码是神圣的,当您编写文本编辑器或查看器时,您负责将文件中的位转换为屏幕上的字形(或回车)。唯一将控制字符(如换行符)与其他字符区分开来的是大多数字体集不包含它们(意味着它们没有可用的视觉表示)。

话虽如此,如果您在更高级别的抽象上工作,那么您可能不会制作自己的文本框控件。如果是这种情况,那么您将被该控件提供给您的任何行结尾所困。即使在这种情况下,自动检测任何字符串的行尾样式并进行相应调整也是一件简单(且相当快速)的事情。

【讨论】:

  • “除非是终端输出,否则您应该始终只使用 \n” - 我怀疑这一点,但这种推理的清晰性正是我所寻找的。​​span>
  • “\n 用于所有其他系统、应用程序和 Internet”这句话离你很远了。许多 Internet 协议需要 \r\n 行结尾 Http 标头需要以 \r\n 终止,并且标头和消息要用 \r\n 分隔
  • 另请参阅 HTTP (7230)、SMTP (RFC5321)、POP3 (RFC1939) 和电子邮件 (RFC2822),其中声明必须为 \r\n 行结尾
  • CSV 规范还需要一个 \r\n 结尾 tools.ietf.org/html/rfc4180#page-2
  • 请注意,自 2018 年以来记事本支持 \n 文件结尾。 devblogs.microsoft.com/commandline/extended-eol-in-notepad
【解决方案3】:

如果您使用 PHP 进行编程,则将行拆分为 \n 然后 trim() 每行(前提是您不关心空格)以给您一个“干净”的行是很有用的。

foreach($line in explode("\n", $data))
{
    $line = trim($line);
    ...
}

【讨论】:

    【解决方案4】:

    对于 php,\n 应该适合你!

    http://php.net/manual/en/language.types.string.php

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多