В чем разница между \ n и \ r (я знаю, что это как-то связано с ОС), и как лучше всего отобразить разрыв строки, который будет работать на разных платформах?
Обновлено: В ответ на Jarod я буду использовать ths для вывода разрыва строки в файле журнала .txt, хотя уверен, что буду использовать его в будущем для таких вещей, как отображение макета HTML на странице.






\n - это разрыв строки Linux / Unix.\r - это классический перенос строки Mac OS (не OS X). Mac OS X использует указанный выше unix \n.\r\n - это разрыв строки Windows.Обычно я просто использую \n в наших системах Linux, и большинство приложений для Windows все равно справляются с этим.
Если я использую \ r \ n, он будет работать в Linux и в Windows? Кроме того, будет ли он выводить \ r как текст в Linux, если я это сделаю?
У меня сейчас нет доступа к linux для проверки, но я уверен, что \ r не выводится должным образом в linux, если вы просматривали его как текстовый файл. Должно быть довольно легко протестировать различные варианты, если вам нужно увидеть, как они выглядят.
Нет, он не будет печатать, для максимальной совместимости используйте \ r \ n
Теперь, когда Mac OS X является Unix, используется ли \ n?
@ Imran - хороший вопрос! Мне самому это было интересно, но у меня нет Mac OS X для тестирования.
Да, Mac OS X также использует \n. \r сейчас полностью устарел.
Ответ Джарода содержит правильное использование \ r \ n в различных ОС. Вот немного истории:
Термины «возврат каретки» и «перевод строки» восходят к тому времени, когда вместо терминалов с монитором и клавиатурой использовались телетайпы. Что касается телетайпов или пишущих машинок, «возврат каретки» означал перемещение курсора и возврат к первому столбцу текста, в то время как «перевод строки» означал вращение ролика для перехода к следующей строке. В то время это различие имело смысл. Сегодня комбинации \ n, \ r, \ r \ n для обозначения конца строки текста совершенно произвольны.
Используйте константу 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");
}
}
Неплохая идея, но я хочу, чтобы все было максимально обратно совместимо.
Обратите внимание, что выходные данные не обязательно отправляются в ОС, в которой работает PHP.
Этот ответ нужно пометить как правильный. Я разработал приложение и протестировал его на Hostmonster.com (они работают с RedHat Linux), а клиент развернул код в системе CentOS. В dev "\ n" отображается новая строка, как и ожидалось; на коробке CentOS этого не было. Как только я изменил "\ n" на PHP_EOL, проблема исчезла, и код заработал, как ожидалось. Извлеченный урок: даже несмотря на то, что prod OS является производной от dev OS, и хотя "\ n" должен работать на всех * nix-боксах, если это абсолютно необходимо реализовать правильно, всегда используйте PHP_EOL, никогда "\ n"
Те, которые пришли сюда из-за того, что preg_match не обнаруживает окончания строки, замените $ на (?:\r\n|\r|\n|$) (где ?: - это группа регулярных выражений без захвата).
Для PHP_EOL на PHP4 обратная совместимость не требуется.
Необходимо исправить утверждение Мура о постоянной доступности PHP_EOL: «... объявлено с PHP 5.0.2.».
Нет, он существует с PHP 4.3.10. Любой, кто до сих пор занимается чем-то меньшим, в любом случае не должен заниматься бизнесом. На сегодняшний день никто не должен использовать что-либо меньшее, чем PHP 5!
В дополнение к моему ответу ниже, как вы используете вывод echo'd из php? Очевидно, на веб-странице тег <br/> определяет разрыв строки, поэтому я предполагаю, что он используется по-другому?