Напоминание - \ r \ n или \ n \ r?

390

Я просто не могу вспомнить их. Итак, что является правильным способом правильно завершить старомодные линии ASCII?

Даниэль Мошмондор
источник
11
Если вы сделаете это, убедитесь, что вы открываете свои файлы в двоичном режиме . В противном случае стандартные файловые потоки C / C ++ преобразуют "\ n" (для текстовых файлов (по умолчанию)) в последовательность конца строки (ELS) для конкретной платформы. Таким образом, "\ r \ n" в Windows преобразуется в "\ r \ r \ n" на физическом диске. Примечание: если вы просто используете C / C ++ для чтения файла обратно, вы не заметите, как ELS преобразуется обратно в "\ n" при чтении из файла.
Мартин Йорк,
@Martin - я нахожусь в .net и использую (для этого примера) File.AppendAllText с «\ r \ n», и я только что посмотрел в файл, и в конце линия. Магия?
Даниэль Мошмондор
@ Даниель: я должен был быть более конкретным. C / C ++ потоки. При связывании с файлом и открытии в текстовом режиме . Это также зависит от того, как вы смотрите на файл (используйте hexeditor).
Мартин Йорк
@Martin - использовал PSPad в шестнадцатеричном режиме ...
Даниэль Мошмондор
1
На древних клавиатурах клавиша Enter называлась клавишей Return. Итак, сначала пришел Return, затем в ответ был сгенерирован перевод строки. Это так очевидно, когда у тебя слишком много истории.
Марк Рэнсом

Ответы:

1084

Я бы использовал слово ' r etur n ', чтобы запомнить, r стоит перед n.

Дэвид Снабель-Каунт
источник
116
И помните, что используемое слово - это возврат , помните, что \ r - это возврат каретки . Не забывайте, что «Return» - это название клавиши на клавиатурах Mac, иначе вы могли бы позже взглянуть на клавиатуру ПК, увидеть клавишу «Enter» и получить неправильный буквенный порядок!
Роб Кеннеди
3
@David Но мне было интересно , что эффект \n\rи \r\nтакой же, не они же эффект? ты можешь сказать разницу?
Анубис
7
@ Mr.Anubis, если у вас есть определенный матричный принтер, не должно быть никакой разницы, так как порядок команд не должен быть важным. Однако на некоторых принтерах вы получите лишнюю пустую строку или вообще не будете ее продвигать. И все сказанное выше относится к текстовым редакторам - они будут сбиты с толку, классы TextStream будут болеть и так далее. Заказать IS важно. :)
Даниэль Мошмондор
12
@ DanielMošmondor В качестве альтернативы, вы можете просто помнить, что порядок важен. Или что, когда вы спросили в SO, кто-то дал вам RemiNder, который вы позже забыли. Или что вы не можете использовать свою фамилию в качестве напоминания, потому что порядок r и n там обратный :)
Даниэль Даранас
5
@RobKennedy ха-ха, вы знаете, я пришел сюда и прочитал о возвращении, и подумал «здорово!». Тогда я читаю ваш комментарий. Теперь каждый раз, когда я не могу вспомнить, на какой ключ мне не следует смотреть - я смотрю на свою клавишу «Ввод» и думаю, что «здесь что-то не так»… ха-ха, думая об этом!
Уэйн Урода
53

Если вы используете C #, вы должны использовать Environment.NewLine, что в соответствии с MSDN это:

Строка, содержащая «\ r \ n» для не-Unix-платформ, или строка, содержащая «\ n» для Unix-платформ.

BrunoLM
источник
46
На самом деле этот вид зависит от того, что вы делаете. Если вы просто выводите простой текст на консоль или в файл для локального использования, Environment.NewLineэто нормально. Однако, если вы пишете вещи в четко определенном формате, формат может также определять и новую строку. Например, протокол HTTP указывает, что вы должны использовать \r\nв качестве ограничителя строки для заголовков и т. Д., Независимо от платформы.
Матти Вирккунен
3
Да, это действительно плохой совет.
IvanP
Вот почему вам нужно экранировать свои веб-сообщения и создавать модульные тесты, чтобы проверить правильность отправки \ r \ n (windows), \ r (mac), \ n (linux) как \ r \ n на веб-сервер.
TamusJRoyce
37

Новая строка зависит от вашей ОС:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Более подробная информация здесь: https://ccrma.stanford.edu/~craig/utility/flip/

В случае сомнений используйте любое бесплатное шестнадцатеричное средство просмотра / редактирования, чтобы увидеть, как файл кодирует новую строку.

Для меня, я использую следующее руководство , чтобы помочь мне вспомнить: 0D0A = \ г \ п = CR, LF = ча Rr МАГП г eturn, ли п е корма

солнце
источник
7
Как ни странно, я один из таких людей, который знает 0D0Aнаизусть, но все же смущает \rи \n.
Nyerguds
1
Или я помню, что \ r - это возврат каретки, а \ n - перевод строки ... просто я не помню их порядок, поэтому не помогает запомнить, какой из них 0D, а какой 0A;)
Nyerguds
20

Последовательность: CR (возврат каретки) - LF (перевод строки). Помните матричные принтеры? Точно. Итак, правильный порядок \ r \ n

Otávio Décio
источник
Я думаю, что это самый логичный ответ
Дэвид Снабель-Каунт
12
LF + CR будет делать то же самое CR + LF на принтерах.
Икегами
10
Я не согласен, @David. Просто думать о матрично-матричных принтерах (или пишущих машинках, поскольку у них есть каретка для возврата) недостаточно. Имея только основную информацию о том, как они работают, нет оснований думать, что имеет значение, продвинемся ли мы до или после возвращения в начало строки. И \ r \ n, и \ n \ r помещают бумагу в одинаковое положение.
Роб Кеннеди
@ikegami на большинстве принтеров, а не на всех. У них также были DIP-переключатели для настройки этого поведения. :)
Даниэль Мошмондор
5
Одна из причин размещения перевода строки после возврата каретки заключается в том, что сокращается общее количество требуемого времени - когда головка возвращается к левому краю бумаги, валик может индексировать одну строку. Чем дольше операция начинается первой, тем самым вся операция завершается за время, которое требуется для выполнения более длительной операции. Мы сделали много вещей по таким причинам тогда; представьте, что вы ожидаете пару сотен строк со скоростью 110 бод ...
Джерри Эндрюс
8

В любом .NET языке, Environment.NewLineбыло бы предпочтительнее.

Эстебан Арайя
источник
Не работает для постоянных строк. При необходимости лучше не использовать константу и вместо
нее
5

Будьте осторожны с этим вручную.
На самом деле я бы посоветовал не делать этого вообще.

В действительности мы говорим о последовательности завершения строки LTS, которая специфична для платформы.

Если вы откроете файл в текстовом режиме (т.е. не в двоичном), то потоки преобразуют «\ n» в правильный LTS для вашей платформы. Затем преобразуйте LTS обратно в "\ n", когда вы читаете файл.

В результате, если вы напечатаете «\ r \ n» в файл Windows, вы получите последовательность «\ r \ r \ n» в физическом файле (посмотрите в шестнадцатеричном редакторе).

Конечно, это настоящая боль, когда речь идет о передаче файлов между платформами.

Теперь, если вы пишете в сетевой поток, я бы сделал это вручную (так как большинство сетевых протоколов вызывают это). Но я хотел бы убедиться, что поток не делает никакой интерпретации (поэтому двоичный режим был уместен).

Мартин Йорк
источник
4

\r\n для Windows подойдет просто отлично.

штифтик
источник
Сингл \nпрекрасно работает и на Windows, включая последнюю версию Notepad.
Андре Карон
Я думаю, что современные редакторы будут определять окончания строк, так как разные ОС используют разные окончания.
Дэвид Снабел-Каунт
1
На самом деле нет: если вы печатаете это в файл (стандартный файл C / C ++, открытый в текстовом режиме) в Windows, физический файл будет содержать «\ r \ r \ n» (проверьте это с помощью шестнадцатеричного редактора). Когда вы читаете его обратно, «\ r \ n» преобразуется обратно в один «\ n».
Мартин Йорк,
2
На самом деле, @DavidCaunt, я только что попробовал \ n, и он не работает с блокнотом на Win8.
philk
4

Из Википедии (вы можете прочитать, что является правильным для вашей ОС в этой статье):

Системы, основанные на ASCII или совместимом наборе символов, используют либо LF (перевод строки, '\ n', 0x0A, 10 в десятичном формате) или CR (возврат каретки, '\ r', 0x0D, 13 в десятичном формате) по отдельности, либо CR, за которым следует CR LF (CR + LF, '\ r \ n', 0x0D0A).

bhamby
источник
3

\r\n

Странно сказать, я помню это, потому что это противоположность пишущей машинке, которую я использовал.
Ну, если бы это было нормально, мне не нужно было это помнить ...:-)

пишущая машинка из википедии * Изображение из Википедии

В пишущей машинке, когда вы заканчиваете оцифровку строки, вы используете рычаг возврата каретки , который до того, как заставляет катиться барабан, перевод строки и после, позволяют вам вручную управлять возвратом каретки .

Вы можете прослушивать из этой записи на freesound.org звук подачи бумаги в начале и примерно через -1: 03 секунды после конца, после звукового сигнала об окончании звука линии барабана, который катится, и после возврат каретки.

Hastur
источник
2

если вы используете C #, почему бы не использовать Environment.NewLine? (Я предполагаю, что вы используете некоторые объекты файлового писателя ... просто передайте его, Environment.NewLineи он будет обрабатывать правильные терминаторы.

NirMH
источник