Как \ n и \ r обрабатываются по-разному в Linux и Windows?

22

Я думаю, \nперемещает иглу вниз и \rперемещает иглу в начало линии (выравнивание по левому краю)? Я не уверен, хотя. Так что, если я ошибаюсь, поправьте меня ...

Во всяком случае, мне сказали , что для Windows и Linux ручка newlinesи по- carriage returnsразному. Я хотел бы знать, как они относятся к ним по-разному и в некоторых местах, где важно помнить. Спасибо за ответ.

千里 ち ゃ ん
источник
Пока я знаю, что \r\nэто нормально в Windows, но \n\rэто не так, и я помню это, потому что \r\nэто аббревиатура для зарегистрированной медсестры. Я также слышал, что \nэто то, что люди используют в Linux и \rне используются в одиночку для той же цели, что и \r\n. \rиспользуется в действительно старых MacOS. Я не проверял эти факты, хотя.
ん ち ゃ ん
4
Не звоните им, \rи \n, как это \nделается, зависит от того, где вы его используете. Лучше позвонить им CRи LF.
Игнасио Васкес-Абрамс
Игнасио, эти аббревиатуры не имеют для меня значения. Как вы это называете: /? ОН ... ЛИНИЯ ПОДАЧА И ВОЗВРАТ ПЕРЕВОЗКИ. Спасибо, слеске.
ん ち ゃ ん
@ IgnacioVazquez-Abrams - это не то же самое, что LF? Разве на любой ASCII-диаграмме символ 13 = \ n = LF?
Бароп
1
@barlop: не в C при выводе в Windows.
Игнасио Васкес-Абрамс

Ответы:

21

Я думаю, что \ n перемещает стрелку вниз, а \ r перемещает стрелку в начало строки (выравнивание по левому краю)? Я не уверен, хотя

Это правда, более или менее, но в основном историческое любопытство. Первоначально, подача строки (LF) использовалась, чтобы продвинуть бумагу одной линией на принтерах и печатных терминалах ( телепринтеры ); возврат каретки (CR) вернул печатающую головку в начало строки.

Это, вероятно, все еще работает на современных принтерах, когда используется в «текстовом режиме», но в остальном сегодня не имеет большого значения.

Во всяком случае, мне сказали, что Windows и Linux по-разному обрабатывают переводы строки и возврат каретки.

Разница в том, что разработчикам ОС приходилось выбирать, как изобразить начало новой строки текста в компьютерных файлах. По разным историческим причинам в мире Unix / Linux в качестве маркера новой строки был выбран один символ LF; MS-DOS выбрал CR + LF, и Windows унаследовала это. Таким образом, разные платформы используют разные соглашения.

На практике это становится все меньше и меньше проблемой. Маркер новой строки действительно имеет отношение только к тем программам, которые обрабатывают «простой текст», и их не так много - он в основном влияет только на исходный код программы, файлы конфигурации и некоторые простые текстовые файлы с документацией. В настоящее время большинство программ, обрабатывающих файлы такого типа (редакторы, компиляторы и т. Д.), Могут обрабатывать оба соглашения новой строки, поэтому не имеет значения, какой из них вы выберете.

В некоторых случаях инструменты настаивают на «своем» соглашении о новой строке (например, сценарии оболочки Unix не должны использовать CR + LF), и в этом случае вы должны использовать правильный.

sleske
источник
Та же самая линия вопросов: распознают ли языки программирования \n\rи \nявляются ли они одинаковыми? Например, если бы я выполнял синтаксический анализ текстового файла, который был отредактирован на чужом компьютере и содержал как разрывы строк для Linux, так и для Windows, выполнил бы preg_matchfor \nи \n\rдал бы другие результаты?
ん ち ゃ ん
@ 千里 ち ゃ ん: Это полностью зависит от языка программирования, компилятора и т. Д. В частности, если вы используете регулярные выражения, это будет зависеть от используемого вами механизма регулярных выражений - некоторые различают разные окончания строк, некоторые нет (большинство можно настроить в любом случае, Я верю).
Слеське
@ 千里 ち ゃ ん: Если у вас есть вопрос о том, как какой-то системный язык / язык программирования / механизм регулярных выражений обрабатывает различные соглашения о переводе строки, просто задайте это как отдельный вопрос.
Слеське
Вы должны писать \ r \ n не так, как вы. Что касается языков программирования, они могут читать отдельные символы, и вы, программист, можете видеть, какой из них используется для ввода, и вы, программист, можете также делать то, что вы хотите для вывода. Точно так же, как вы могли бы сказать «Пишите ABC, а затем \ r \ r \ r \ n» любые символы, которые вы хотите вставить в конце! некоторые другие символы не могут быть напечатаны и не могут быть графическими или какими-либо еще. Они могут иметь некоторые встроенные функции, такие как println, и то, что они используют для своей новой строки, будет одной или другой, это не может быть и то и другое.
Бароп
@ 千里 ち ゃ ん и некоторые языки программирования могут позволять вам выбрать, какой конец строки может быть задан в одной из их встроенных функций, так что даже в встроенной функции вы можете ... теоретически в любом случае. +, как уже упоминалось, на практике вы можете написать любой конец строки, какой захотите ... хотя, возможно, вы не сможете сделать это так эффективно, как с помощью функции println.
Бароп
14

CR и LF

В Американском стандартном коде для обмена информацией (ASCII) определены управляющие символы, включая CARRIAGE-RETURN (CR) и LINE-FEED (LF), которые использовались (и остаются) для управления положением печати на принтерах способом, аналогичным механические пишущие машинки, которые предшествовали ранним компьютерным принтерам.

Зависимость от платформы

В Windows традиционным разделителем строк в текстовых файлах является CR, за которым следует LF

В старых (до OSX) системах Apple Macintosh традиционным разделителем строк в текстовых файлах был CR

В Unix и Linux традиционным разделителем строк в текстовых файлах является LF.

\ n и \ r

Во многих языках программирования и написания сценариев \nозначает «новая строка». Иногда (но не всегда) это означает символ ASCII LINE-FEED (LF), который, как вы говорите, перемещает курсор (или позицию печати) вниз на одну строку. В принтере или пишущей машинке это фактически сдвинет бумагу на одну строку вверх.

Неизменно \rозначает символ ASCII CARRIAGE-RETURN (CR), имя которого на самом деле происходит от механических пишущих машинок, где была клавиша возврата каретки, из-за которой валик («каретка»), по которому бумага перемещалась вправо, приводится в движение пружиной, насколько это возможно. Таким образом устанавливая текущую позицию набора текста на левом поле.

программирование

В некоторых языках программирования \nможет означать зависящую от платформы последовательность символов, которые заканчиваются или разделяют строки в текстовом файле. Например, в Perl, print "\n"производит другую последовательность символов в Linux, чем в Windows.

В Java, лучшая практика, если вы хотите использовать собственные окончания строк для платформы времени выполнения, не использовать \nили \rвообще не использовать . Вы должны использовать System.getProperty("line.separator"). Вы должны использовать \nи \rгде вы хотите LF и CR независимо от платформы (например, как используется в HTTP, FTP и других интернет-коммуникационных протоколах).

Unix stty

В оболочке Unix sttyкоманда может использоваться для перевода оболочки между этими различными соглашениями. Например stty -onlcr, заставит оболочку впоследствии преобразовать все исходящие LF в CR LF.

Linux и OSX следуют соглашениям Unix

Текстовые файлы

Текстовые файлы по-прежнему чрезвычайно важны и широко используются. Например, HTML и XML являются примерами текстового файла. Большинство важных интернет-протоколов, таких как HTTP, следуют соглашениям о текстовых файлах и включают спецификации для окончаний строк.

Принтеры

Большинство принтеров, кроме самых дешевых, по-прежнему уважают CR и LF. На самом деле они являются основополагающими для наиболее широко используемых языков описания страниц - PCL и Postscript.

RedGrittyBrick
источник
1
Примечание по Java: как правило, неверно, что вы не должны использовать \ n или \ r вообще. Просто в Java "\ n" всегда LF, а "\ r" всегда CR. Это может быть именно тем, что вы хотите: если вы хотите определенный стиль окончания строки, используйте их; если вы явно хотите, чтобы исходная строка заканчивалась на компьютере, на котором вы работаете, тогда используйте line.separator. Это действительно зависит от того, что вы хотите.
слеске
И кстати, println()автоматически использует line.separator, поэтому, если вы хотите использовать собственные окончания строк, вы можете использовать их println()(и если вам нужен определенный конкретный тип окончания строки, не используйте его, но используйте «\ n» и т. Д. Явно).
слеске
@Sleske: Хорошие моменты. Я обновлю свой ответ соответственно.
RedGrittyBrick
1
Существуют ли какие-либо языки или компиляторы, где \nуправляющий символ отличается от ASCII LF (кроме систем на основе EBCDIC)? Я имею в виду то, что \nозначает в строковом или символьном литерале, а не эффект отправки его в файл или устройство вывода.
Кит Томпсон
1
@KeithThompson: Для Java: Да, \nвсегда код ASCII (и Unicode) 10, потому что JLS говорит об этом явно (JLS 3.10.6, «Escape-последовательности для символьных и строковых литералов» - я проверял :-)). Для других языков - хороший вопрос.
слеске
4

Короче, был нужен для принтеров, но сейчас ОС делают это немного по-другому. В большинстве случаев хорошо просто выполнять CR и LF, \r\nи в большинстве случаев это будет работать нормально.

Джеймс Биллингем
источник
Linux просто игнорирует \rили это вызывает какое-то изменение поведения?
Аарон Франке