PHP回车换行

46

什么是 \n 和 \r 的区别(我知道这与操作系统有关),以及在跨平台环境下,最佳的换行符输出方法是什么?

编辑:响应Jarod的要求,我将使用此方法在 .txt 日志文件中输出换行符,尽管我相信我将来会用它来输出HTML标记到页面上。


根据我下面的回答,你是如何使用 PHP 的输出呢?显然,在网页中,<br/> 标签定义了换行符,所以我假设它被用于不同的方式? - Jarod Elliott
4个回答

130

使用PHP_EOL常量,该常量会自动设置为PHP脚本所运行的操作系统的正确换行符。

请注意,此常量自PHP 5.0.2以来就已声明。

<?php
    echo "Line 1" . PHP_EOL . "Line 2";
?>

为了向后兼容:

if (!defined('PHP_EOL')) {
    switch (strtoupper(substr(PHP_OS, 0, 3))) {
        // Windows
        case 'WIN':
            define('PHP_EOL', "\r\n");
            break;

        // Mac
        case 'DAR':
            define('PHP_EOL', "\r");
            break;

        // Unix
        default:
            define('PHP_EOL', "\n");
    }
}

不是一个坏主意,但我想尽可能保持向后兼容性。 - PHLAK
9
请注意,输出不一定会发送到运行 PHP 的操作系统。 - eyelidlessness
6
请将此答案标记为正确答案。我开发了一个应用程序并在 Hostmonster.com 上进行了测试(他们运行 RedHat Linux),客户将代码部署到 CentOS 盒子上。在 dev 中,"\n" 正如预期的那样呈现为换行符;但在 CentOS 盒子上却没有。一旦我将 "\n" 改为 PHP_EOL,问题就消失了,代码按预期工作。得到的教训是:即使生产系统是开发系统的派生版本,即使 "\n" 应该在所有 *nix 盒子上都能正常工作,如果要绝对正确地实现它,则始终使用 PHP_EOL,而不是 "\n"。 - Mike C.
那些因为preg_match未检测到行尾而来到这里的人,请将$替换为(?:\r\n|\r|\n|$)(其中?:是一个非捕获正则表达式组)。 - CPHPython

49
  • \n是Linux/Unix系统中的换行符。
  • \r是一个经典的Mac OS(非OS X)的换行符。Mac OS X使用上面提到的Unix的\n
  • \r\n是Windows系统的换行符。

我通常只在我们的Linux系统中使用\n,大多数Windows应用程序也可以很好地处理它。


2
如果我使用\r\n,它在Linux和Windows中都能工作吗?此外,如果我这样做,它会在Linux中输出\r作为文本吗? - PHLAK
现在无法访问Linux进行检查,但我非常确定如果您将其视为文本文件,则\r在Linux中不会正确显示。如果您需要查看它们的外观,应该很容易测试各种选项。 - Jarod Elliott
3
不会打印,为了最大兼容性,请使用\r\n。 - UnkwnTech
现在 Mac OS X 是 Unix 系统,所以它使用 \n 吗? - Imran
@Imran - 很好的问题!我也在想,但是没有 Mac OS X 进行测试。 - Jarod Elliott
жҳҜзҡ„пјҢMac OS X д№ҹдҪҝз”Ё\nгҖӮ\rзҺ°еңЁе·Із»Ҹе®Ңе…ЁиҝҮж—¶дәҶгҖӮ - Raphael Schweikert

31

Jarod的答案包含了在不同操作系统上使用 \r \n 的正确方法。以下是一些历史背景:

  • \r,或者ASCII代码为13的字符,被称为“回车符”(CR)。
  • \n,或者ASCII代码为10的字符,被称为“换行符”(newline),或者“行进纸”(LF)。

“回车符”和“换行符”的术语可以追溯到使用打字机或电传打字机而不是带有监视器和键盘的终端时期。对于电传打字机或打字机,“回车符”意味着移动光标并返回文本的第一列,而“换行符”意味着旋转滚轮以进入下一行。那个时候区分是有意义的。今天使用 \n、\r、\r\n 表示文本行结束的组合已经完全是任意的。


7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接