Разница между \ n и \ r? - PullRequest
       83

Разница между \ n и \ r?

521 голосов
/ 19 ноября 2009

В чем разница между \n (перевод строки) и \r (возврат каретки)?

В частности, существуют ли практические различия между \n и \r? Есть ли места, где один должен использоваться вместо другого?

Ответы [ 9 ]

732 голосов
/ 19 ноября 2009

С точки зрения кода ASCII, это 3 - так как они 10 и 13 соответственно; -).

А если серьезно, их много:

  • в Unix и всех Unix-подобных системах, \n - это код конца строки, \r не означает ничего особенного
  • как следствие, в C и большинстве языков, которые каким-либо образом копируют его (даже удаленно), \n является стандартной escape-последовательностью для конца строки (переводится в / из специфичных для ОС последовательностей по мере необходимости)
  • в старых системах Mac (до OS X), \r был кодом для конца строки вместо
  • в Windows (и многих старых ОС) код конца строки состоит из 2 символов, \r\n, в следующем порядке
  • Как следствие (удивительно ;-) (возвращаясь к операционным системам, намного более старым, чем Windows), \r\n - это стандартное завершение строки для текстовых форматов в Интернете
  • для электромеханических телетайпоподобных "терминалов", \r дает команду каретке двигаться назад влево до крайнего левого упора (медленная операция), \n дает команду ролику свернуть на одну линию (гораздо более быстрая операция). ) - вот почему у вас всегда есть \r до \n, чтобы ролик мог двигаться, пока каретка все еще движется влево! -) В Википедии есть более подробное объяснение .
  • для терминалов в символьном режиме (как правило, эмулирует даже более старые печатные, как указано выше), в необработанном режиме \r и \n действуют аналогично (за исключением обоих с точки зрения курсора, поскольку равно нет каретки или ролика; -)

На практике, в современном контексте записи в текстовый файл, вы всегда должны использовать \n (базовая среда выполнения будет переводить это, если вы работаете в странной ОС, например, Windows ;-). Единственная причина использовать \r - если вы пишете в символьный терминал (или, скорее, в «консольное окно», эмулирующее его) и хотите, чтобы следующая строка, которую вы пишете, перезаписывала последнюю, которую вы только что написали (иногда используется для глупости). эффекты "анимации ascii", например, индикаторы выполнения) - это становится довольно устаревшим в мире GUI, хотя; -).

116 голосов
/ 19 ноября 2009

Исторически \n использовалось для перемещения каретки вниз, в то время как \r использовалось для перемещения каретки назад к левой стороне страницы.

31 голосов
/ 19 ноября 2009

Два разных персонажа.

\n используется в качестве конца строки в текстовых файлах Unix

\r используется в качестве конца строки в текстовых файлах Mac

\r\n (т.е. оба) используются для завершения строк в текстовых файлах Windows и DOS.

22 голосов
/ 20 января 2016

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

Когда вы хотели новую строку при использовании пишущей машинки с поддержкой нескольких строк, она должна была выполнить два физических действия: сдвинуть каретку назад к началу (слева, в США) страницы и подать бумагу на одну ступеньку выше.

Когда-то во времена строчных принтеров единственным способом сделать жирный текст, например, было возвращение каретки БЕЗ перевода строки и печать тех же символов поверх старых, добавляя больше чернил, тем самым делая их темнее (жирный шрифт). Когда механическая «новая строка» не работала в пишущей машинке, это было досадным результатом: вы могли печатать поверх предыдущей строки текста, если не обращали внимания.

11 голосов
/ 19 ноября 2009

Два разных символа для разных операционных систем. Также это играет роль в данных, передаваемых через TCP/IP, что требует использования \r\n.

\n Unix

\r Mac

\r\n Windows и DOS.

9 голосов
/ 30 января 2015

Для завершения,

В сценарии оболочки (bash) вы можете использовать \r для отправки курсора впереди в строке и, конечно, \n для установки курсора на новой строке.

Например, попробуйте:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Первый «эхо» дисплей AA--AA
  • Второй: AA--AABB
  • Последний: BB--AABB

Но не забудьте использовать -en в качестве параметров.

3 голосов
/ 11 января 2016

В окнах \ n перемещается в начало следующей строки. \ R перемещается в начало текущей строки, не переходя на следующую строку. Я использовал \ r в своих собственных консольных приложениях, где я тестирую некоторый код, и я не хочу, чтобы текст прокручивался вверх по моему экрану, поэтому вместо использования \ n после распечатки некоторого текста, скажем, с частотой кадров ( FPS), я буду печататьf ("% - 10d \ r", fps); Это вернет курсор в начало строки без перехода к следующей строке и позволит мне иметь на экране другую информацию, которая не прокручивается, пока частота кадров постоянно обновляется в той же строке (% -10 делает уверен, что вывод не менее 10 символов, выравнивание по левому краю, чтобы он заканчивался пробелами, перезаписывая все старые значения для этой строки). Это очень удобно для подобных вещей, обычно, когда у меня выводится отладочный материал на экран консоли.

Немного истории

/ r означает «возврат» или «возврат каретки», который обязан своей истории пишущей машинке. Возврат каретки сдвинул вашу каретку вправо, поэтому вы печатали в начале строки.

/ n означает «новая строка», опять же, с тех дней, когда вы печатали, на новую строку. Не обязательно к началу, хотя, поэтому некоторые операционные системы приняли необходимость как возврата / r, так и перевода строки / n, так как это было в порядке, в котором печатная машинка делала это. Это также объясняет старые 8-битные компьютеры, которые использовали иметь «Return» вместо «Enter» из «возврата каретки», что было знакомо.

0 голосов
/ 07 декабря 2018

Просто, чтобы добавить к путанице, я работал над простым текстовым редактором, использующим элемент TextArea на HTML-странице в браузере. В ожидании проблем совместимости в отношении CR / LF я написал код для проверки платформы и использовал любое соглашение о переводе строки, применимое к платформе.

Однако я обнаружил кое-что интересное при проверке реальных символов, содержащихся в TextArea, с помощью небольшой функции JavaScript, которая генерирует шестнадцатеричные данные, соответствующие символам.

Для теста я набрал следующий текст:

Hello, World [enter]

До свидания, Жестокий мир [введите]

Когда я исследовал текстовые данные, полученная последовательность байтов была такой:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Теперь большинство людей, которые смотрят на это и видят 0a, но не 0d байт, подумают, что этот вывод был получен на платформе Unix / Linux. Но вот в чем проблема: эту последовательность я получил в Google Chrome на 64-битной Windows 7.

Итак, если вы используете элемент TextArea и изучаете текст, ПРОВЕРЬТЕ вывод, как я делал выше, чтобы убедиться, какие фактические байты символов возвращаются из вашей TextArea. Я еще не выяснил, отличается ли это на других платформах или в других браузерах, но стоит иметь в виду, если вы выполняете обработку текста с помощью JavaScript и вам нужно сделать эту платформу независимой от обработки текста.

Соглашения, описанные в постах выше, применяются к выводу console , но элементы HTML, по-видимому, соответствуют соглашению UNIX / Linux. Если кто-то не обнаружит иное на другой платформе / в браузере.

0 голосов
/ 10 марта 2012
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

давайте возьмем этот пример, попробуйте поставить \ n вместо \ r, он не будет работать, и попробуем угадать почему?

...