PHP摆脱令人讨厌的\n广场

zuk*_*uk1 1 php

最难解释的问题:

$lol = "hello";
$that = "* music
* books
* games
* asos
* cry";

$lol = str_replace("*", $line, $that);

$name = str_replace(" ", "-", $line);
$myFile = "output/$name.csv";
$fh = fopen($myFile, 'w') or die("can't open file");

$stringData = $lol;
fwrite($fh, $stringData);
fclose($fh);
Run Code Online (Sandbox Code Playgroud)

我正在查看$ lol变量的大列表,并为每个变量生成一个文本文件,你可以在$中看到文本文件的模板,其中*将成为循环中的$ lol.

所以如果$ lol ="softlayer"我会得到一个csv

softlayer music
softlayer books
softlayer games
etc..
Run Code Online (Sandbox Code Playgroud)

问题是,当我在记事本中打开它们时,它们不是柔软的音乐,等等都在同一条线上,被那些意味着"新线"的可怕方块所分隔.因此,我正在生成的CSV根据我正在尝试使用的软件而被认为是无效的.

这是一个绝对可怕的问题解释,所以请原谅:)

任何帮助都将受到大力赞赏!

Ala*_*orm 8

在预历史的迷雾中,Windows的民俗,民间的Mac和Unix民间不能什么字符(S)同意应表示一个行的结束.在经典Mac OS上,它是一个回车符(\ r \n).在Unix上,它是一个换行符(\n).在Windows上,它是一个回车后跟换行符(\ r \n).

从历史上讲,在旧的打字机上,你必须做两件事才能把头开到新线上.回车(大臂的东西)会将打字机头移回纸张的左侧(或右侧; shalom!).但是,头部仍然在同一条线上.您必须使用第二种机制(换行或换行)将纸张本身向上移动一行.

其原因之一为ASCII标准是编码将要在后面打印出来(通过电报,电传等),以便具有在标准是有道理的两个字符的数据.当决定主要目的是生活在计算机中的文件的标准时,没有人会同意.Windows标准(\ r \n)的使最字面意义,但是Unix和经典的Mac标准(\n为Unix,对经典的Mac\R)保存每行了一下,这是在早期重要.

这已经引起了数十年的混乱,并将继续引起对未来的混乱.在Windows环境中使用Unix工具时尤其如此.很多这些工具都假定\n为行尾.此外,有可能你的PHP源文件编码与UNIX风格的行结束,这意味着分离了几行字符串实际上是由\n换行分割,而程序行为正确.

大多数现代文本编辑器将弄清楚文本文件是如何编码的,并且由作者"按照预期"显示这些行.记事本不是那样工作,并遵循文本文件中的字面意思.

无论如何,以下注册表应将您的行结尾标准化为Windows上的标准

$stringData = preg_replace('/[\n\r]{1,2}$/',"\r\n",$stringData);
Run Code Online (Sandbox Code Playgroud)

或者,您可以构造字符串以使用回车符/换行符结束

$string = "line 1\r\nline 2";
$string = "line 1\r\n".
          "line 2\r\n";
Run Code Online (Sandbox Code Playgroud)