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

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

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

12 ответов

Решение

С точки зрения кода 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, чтобы ролик мог двигаться, пока каретка все еще движется влево!-) В Википедии есть более подробное объяснение.
  • для терминалов в символьном режиме (как правило, эмулируют даже более старые печатные устройства, как указано выше), в режиме raw, \r а также \n действовать аналогично (за исключением того, что касается курсора, поскольку нет каретки или ролика;-)

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

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

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

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

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

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

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

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

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

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

\n Юникс

\r макинтош

\r\n Windows и DOS.

  • Возврат каретки: возвращает каретку в начало строки.
  • Перевод строки: подача бумаги вверх на одну строку

В контексте вывода на экран:

  • CR: возвращает курсор в начало текущей строки
  • LF: перемещает курсор вниз на одну строку

Например:

Привет,\nмир\r!

должен отображаться на вашем терминале как:

      Hello,
!     world

Некоторые операционные системы могут нарушать совместимость с предполагаемым поведением, но это не меняет ответа на вопрос «Разница между \n и \r?».

Завершить,

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

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

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

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

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

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

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

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

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

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


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

Я знаю, что этот вопрос задавался как независимый от языка. Тем не менее, нам нужен язык, по крайней мере, для проведения эксперимента. В моем случае я выбрал C++, но эксперимент в целом применим на любом языке программирования.

Программа просто выполняет итерацию, чтобы вывести предложение в консоль, выполняя итерацию цикла for.


Программа Newline:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Выход:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Обратите внимание, что этот результат не будет предоставлен ни в одной системе, вы выполняете этот код C++. Но он будет работать для самых современных систем. Подробнее читайте ниже.


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

Программа возврата каретки:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Выход:

7.Walkthrough of the for-loop 

Заметили, где разница? Разница в том, что при использовании escape-последовательности возврата каретки\r в конце каждой последовательности печати следующая итерация этой последовательности не попадает в следующую текстовую строку - в конце каждой последовательности печати курсор не перескакивал на * начало следующей строки.

Вместо этого курсор переместился обратно в начало строки, в которой он находился в конце, перед использованием \rхарактер. - В результате каждая следующая итерация последовательности печати заменяет предыдущую.

* Примечание: A \nне обязательно переходить к началу следующей текстовой строки. На некоторых, как правило, более старых операционных системах результат\nСимвол новой строки может быть таким, что он переходит в любое место следующей строки, а не только в начало. Вот почему они хотят использовать\r \n чтобы попасть в начало следующей текстовой строки.


Этот эксперимент показал нам разницу между новой строкой и возвратом каретки в контексте вывода итерации последовательности печати.

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

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

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

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

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

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

Я написал пример возврата каретки на основе ответа Яна Бойда .

Этот скрипт Python будет печатать символы в одной строке, возвращая каретку в начало строки.

\r

      import time
for i in "I'm", "N", "Ne", "Neo":
    time.sleep(1)
    print(i, end='\r')

\n

      import time
for i in "I'm", "N", "Ne", "Neo":
    time.sleep(1)
    print(i, end='\n')
Другие вопросы по тегам