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

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

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

Ответ 1

В терминах ascii-кода это 3 - с 10 и 13 соответственно ;-).

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

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

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

Ответ 2

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

Ответ 3

Два разных символа.

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

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

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

Ответ 4

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

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

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

Ответ 5

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

\n Unix

\r Mac

\r\n Windows и DOS.

Ответ 6

Чтобы завершить,

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

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

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Первый экран "echo" AA--AA
  • Второе: AA--AABB
  • Последнее: BB--AABB

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

Ответ 7

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

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

Значение/r означает "возврат" или "возврат каретки", который должен иметь историю для пишущей машинки. Возврат каретки перемещал вашу каретку до упора вправо, так что вы печатали в начале строки.

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

Ответ 8

#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, он не будет работать и попытаться угадать, почему?

Ответ 9

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

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

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

Привет, Мир [введите]

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

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

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. Но вот здесь rub: эта последовательность, которую я получил в Google Chrome на 64-разрядной версии Windows 7.

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

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

Ответ 10

Практический ответ в * nix системах заключается в том, что \r позволяет вам обновить уже написанную строку, вернувшись к началу строки (без изменения строки), и переписать текст, который вы написали ранее. Используется, например, для печати полос загрузки или обновления ETA для таких инструментов командной строки, как wget.