PHP избавиться от неприятных \ n квадратов - PullRequest
1 голос
/ 18 марта 2009

Самая сложная проблема для объяснения:

$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 находится в цикле.

Так что, если $ lol = "softlayer", я бы получил CSV с

softlayer music
softlayer books
softlayer games
etc..

Проблема в том, что когда я открываю их в блокноте, они не являются музыкой софт-слоя, и т. Д. Все они находятся на одной линии, отделенной этими ужасными квадратами, которые означают «новую линию». И из-за этого генерируемые мной CSV предположительно являются недействительными в соответствии с программным обеспечением, с которым я пытаюсь их использовать.

Это была абсолютно ужасная проблема, чтобы объяснить, так что извините:)

Любая помощь будет высоко ценится!

Ответы [ 2 ]

8 голосов
/ 18 марта 2009

В тумане предыстории люди Windows Folk, Mac Folk и Unix не могли договориться о том, какие символы должны обозначать конец строки. На классической Mac OS это был возврат каретки (\ r). В Unix это была новая строка (\ n). В Windows это был возврат каретки, за которым следовала новая строка (\ r \ n).

С исторической точки зрения, на старых печатных машинках вам приходилось делать две вещи , чтобы получить голову на новой строке. Возврат каретки (вещь с большой рукой) переместит головку пишущей машинки назад к левой стороне (или правой стороне; шалом!) Бумаги. Тем не менее, голова все равно будет на той же линии. Вы должны задействовать второй механизм (перевод строки или перевод строки), чтобы переместить саму бумагу вверх на одну строку.

Одной из причин стандарта ASCII было кодирование данных, которые собирались впоследствии распечатать (через телеграф, телетайп и т. Д.), Чтобы оба символа в стандарте имели смысл. Когда пришло время выбирать стандарт для файлов, основной целью которых было жить на компьютере, никто не мог согласиться. Стандарт Windows (\ r \ n) имеет самый буквальный смысл, но стандарты Unix и Classic Mac (\ n для Unix, \ r для Classic Mac) сохранили немного для каждой строки, что было важно в первые дни.

Это вызывало путаницу на протяжении десятилетий и будет продолжать вызывать путаницу в будущем. Это особенно верно при использовании инструментов Unix в среде Windows. Многие из этих инструментов предполагают конец строки как \ n. Кроме того, возможно, ваш исходный файл PHP закодирован с окончанием строк в стиле Unix, что означает, что строка, разделенная на несколько строк, фактически разделена \ n символами новой строки, и ваша программа работает правильно.

Большинство современных текстовых редакторов выяснят, как кодируется текстовый файл, и отобразят строки «как задумано» автором. Блокнот работает не так и подчиняется буквальному текстовому файлу.

Независимо от всего этого, следующий регулярный пример должен нормализовать окончания строк в соответствии со стандартами для окон

$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 голос
/ 18 марта 2009

Попробуйте вместо "\ r"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...