最难解释的问题:
$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);
我正在查看$ lol变量的大列表,并为每个变量生成一个文本文件,你可以在$中看到文本文件的模板,其中*将成为循环中$ lol中的任何一个。 / p>
所以,如果$ lol =“softlayer”,我会得到一个带有
的csvsoftlayer music
softlayer books
softlayer games
etc..
问题是,当我在记事本中打开它们时,它们不是柔软的音乐,等等都在同一条线上,被那些意味着“新线”的可怕方块所分隔。因此,根据我正在尝试使用的软件,我生成的CSV应该是无效的。
这是一个绝对可怕的问题,因此请原谅我:)
任何帮助都会受到大力赞赏!
答案 0 :(得分:8)
在史前的迷雾中,Windows Folk,Mac Folk和Unix民众无法就什么字符应该表示一行的结尾达成一致。在经典Mac OS上,它是一个回车符(\ r \ n)。在Unix上,它是一个换行符(\ n)。在Windows上,它是一个回车符后跟换行符(\ r \ n)。
从历史上讲,在旧的打字机上,你必须做两件事才能让头脑进入一条新线。回车(大臂的东西)会将打字机头移回纸张的左侧(或右侧; shalom!)。但是,头部仍然在同一条线上。您必须使用第二种机制(换行或换行)将纸张本身向上移动一行。
ASCII标准的一个原因是对稍后打印出来的数据进行编码(通过电报,电传打字机等),因此标准中的两个字符都是有意义的。当决定主要目的是生活在计算机中的文件的标准时,没有人会同意。 Windows标准(\ r \ n)是最直观的意义,但是Unix和Classic Mac标准(对于Unix来说是\ n,对于经典Mac来说是\ r),每行都节省了一点,这在早期很重要。 / p>
这引起了数十年的混乱,并将继续引起对未来的混乱。在Windows环境中使用Unix工具时尤其如此。很多这些工具都假定\ n为行尾。此外,您的PHP源文件可能使用unix样式行结尾进行编码,这意味着分隔多行的字符串实际上被\ n换行分割,并且您的程序行为正常。
大多数现代文本编辑器将弄清楚如何编码文本文件,并显示作者“按预期”的行。记事本不能像那样工作,并且遵循文本文件中的字面意思。
无论如何,以下注册表应将您的行结尾标准化为Windows上的标准
$stringData = preg_replace('/[\n\r]{1,2}$/',"\r\n",$stringData);
或者,您可以构造字符串以使用回车符/换行符结束
$string = "line 1\r\nline 2";
$string = "line 1\r\n".
"line 2\r\n";
答案 1 :(得分:1)
请尝试“\ r”?