【问题标题】:text file carriage return not displaying with PHP_EOL文本文件回车不显示 PHP_EOL
【发布时间】:2016-10-31 01:20:13
【问题描述】:

我正在使用 PHP_EOL 在 PHP 中的文本文件中添加新行。我了解换行和回车之间的区别,但是当我导出文本文件并通过十六进制编辑器查看它而不是看到 0D0A(回车,换行)时,我最后只看到 0A(这是换行)每一行。

通常这不会有问题,但上游程序需要在每行的末尾看到 0D0A。

我被困在这个问题上,希望能得到一些帮助。

我也尝试过 "\r\n" 但这会产生更糟的结果。它产生的不是 0D0A 而是 0A0A 或 \n\n!

另外需要注意的是,这是托管在 linux 系统上并使用 windows 下载的(不知道操作系统下载它是否重要)

谢谢

【问题讨论】:

  • PHP_EOL 在执行脚本的机器环境中被解释。因此,如果您在 Linux 机器上执行它,那么它将始终输出 \n,同样,如果您在 Windows 服务器上运行相同的 php 脚本,那么它将输出微软认为适合在其无限智慧中使用的任何损坏的行结尾。
  • 感谢杰夫,这是有道理的。所以按照这个逻辑,我应该正确使用“\r\n”。但这会导致双换行......所有这一切中最奇怪的部分是这个确切的脚本运行良好,但直到一周前。
  • 我不知道,这很奇怪。试试echo chr(0x0D); 看看是否至少会吐出文字字符。由于它最近发生了变化,请检查您的更改日志。如果您通过二进制搜索检查自上次工作代码以来的提交,应该很容易确定您是否使用版本控制。

标签: php text


【解决方案1】:

取决于托管脚本的系统,\n 和 \r 具有相同的含义,但在非常过时的服务器上 PHP_EOL 可能未定义,我总是使用此位代码来保留我的 PHP_EOL:

<?php
  if (!defined('PHP_EOL')) {
    if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
      define('PHP_EOL',"\r\n");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
      define('PHP_EOL',"\r");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'DAR')) {
      define('PHP_EOL',"\n");
    } else {
      define('PHP_EOL',"\n");
    }
  }
?>

所以你可以毫无问题地使用 PHP_EOL... PHP_EOL 表示 \n 或 \r 或 \r\n...

注意:PHP_EOL可以是

1) on Unix    LN    == \n
2) on Mac     CR    == \r
3) on Windows CR+LN == \r\n
4) on Darwin  LN    == \n

Darwin 是类似于 Unix 的 MacOS X,具有相同的行尾...

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2012-04-12
    • 2021-03-21
    相关资源
    最近更新 更多