В тумане предыстории люди 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";