В чем разница между \n
(новая строка) и\r
(возврат каретки)?
В частности, есть ли практические различия между \n
и \r
? Есть ли места, где один должен использоваться вместо другого?
В чем разница между \n
(новая строка) и\r
(возврат каретки)?
В частности, есть ли практические различия между \n
и \r
? Есть ли места, где один должен использоваться вместо другого?
Ответы:
С точки зрения кода ASCII, это 3 - так как они 10 и 13 соответственно ;-).
А если серьезно, их много:
\n
это код для конца строки,\r
ничего особенного не означает\n
это стандартная escape-последовательность для конца строки (переводится в / из специфичных для ОС последовательностей по мере необходимости)\r
вместо этого использовался код конца строки\r\n
, в этом порядке\r\n
это стандартное окончание строки для текстовых форматов в Интернете\r
подает команду каретке вернуться влево, пока она не достигнет крайнего левого упора (медленная операция),\n
дает команду ролику свернуть на одну строку (гораздо более быстрая операция) - вот почему у вас всегда есть \r
раньше \n
, чтобы ролик мог двигаться, пока каретка все еще движется влево! -) В Википедии есть более подробное объяснение .\r
и \n
действует аналогично ( за исключением того, как с точкой зрения курсора, так как нет нет каретки или валика ;-)На практике, в современном контексте записи в текстовый файл, вы всегда должны использовать \n
(базовая среда выполнения переведет это, если вы находитесь в странной ОС, например, Windows ;-). Единственная причина использовать\r
- если вы пишете в символьный терминал (или, скорее, в «консольное окно», эмулирующее его) и хотите, чтобы следующая строка, которую вы пишете, перезаписывала последнюю, которую вы только что написали (иногда используется для тупой анимации ascii) «эффекты, например, индикаторов выполнения) - это становится довольно устаревшим в мире GUI, хотя ;-).
\0
были добавлены дополнительные безвредные символы (обычно NUL, т. Е. ), \n
Чтобы время. Это было прозрачно обработано ОС, поэтому вы не найдете его следов в унаследованном коде.
\r
(я использую Linux). Когда я начал синтаксический анализ того, что казалось правильным файлом, мой парсер не удался, потому что файл, который я анализировал, был создан в Windows. : D Основной проблемой во всем , что является то , что ни один, \n
или \r
видимы в том смысле , что, например a
, .
, и (
т.д. символы.
Исторически a \n
использовалось для перемещения каретки вниз, в то время \r
как для перемещения каретки назад к левой стороне страницы.
printf("abcdefghijlm\rNOP\n");
скомпилированный с gcc-8 в OpenSuSe и запущенный на терминале, в результате вы получите следующие результаты NOPdefghijlm
. \ R (возврат каретки) в строке приводит к перемещению курсора в начало строки (каретка), а символы, следующие за \ r (т. Е. «NOP»), перезаписывают то, что было ранее (т. Е. «Abc»)! Вы можете добиться такого же «движения каретки» с помощью backspace (\ b), как и в printf("abcdefghijlm\b\bNOP\n");
которомabcdefghijNOP
Два разных персонажа.
\n
используется как терминатор конца строки в текстовых файлах Unix
\r
используется как терминатор конца строки в текстовых файлах Mac
\r\n
(т.е. оба) используются для завершения строк в текстовых файлах Windows и DOS.
\r
давно не было конца строки на Mac. С выпуском Mac OS X в 2001 году (который основан на Unix), \n
теперь используется.
\r
например MS Office 2011 Excel: сохранение CSV-файла (со всеми настройками по умолчанию), все же сохранят файл в кодировке ISO-8859-1 с \r
окончанием -line.
Поскольку никто другой не упомянул об этом конкретно (они слишком молоды, чтобы знать / помнить?) - я подозреваю, что использование \r\n
оригинальных пишущих машинок и подобных устройств.
Когда вы хотели новую строку при использовании многострочной пишущей машинки, она должна была выполнить два физических действия: сдвинуть каретку назад к началу (слева, в США) страницы и подать бумагу на одну ступеньку вверх. ,
Например, во времена строчных принтеров единственный способ сделать жирный текст состоял в том, чтобы сделать возврат каретки БЕЗ новой строки и напечатать те же символы поверх старых, добавив тем самым больше чернил, что делает его темнее (жирнее) , Когда механическая функция «новой строки» не работала в пишущей машинке, это было досадным результатом: вы могли печатать поверх предыдущей строки текста, если не обращали внимания.
Два разных персонажа для разных операционных систем. Также это играет роль в передаваемых данных, TCP/IP
которые требуют использования\r\n
.
\n
Юникс
\r
макинтош
\r\n
Windows и DOS.
Завершить,
В сценарии оболочки (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» из «возврата каретки», что было знакомо.
Просто чтобы добавить к путанице, я работал над простым текстовым редактором, используя элемент 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, это не сработает, и попробуем угадать, почему?
Return
и другое Enter
. Даже моя современная беспроводная клавиатура все еще показывает стрелку «вниз» и «назад» на старой Return
клавише (которая теперь называется «Enter», чтобы соответствовать 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
чтобы получить в начале следующей текстовой строки.
Этот эксперимент показал нам разницу между переводом строки и возвратом каретки в контексте вывода итерации последовательности печати.
При обсуждении ввода в программу некоторые терминалы / консоли могут неявно преобразовывать возврат каретки в новую строку для лучшей переносимости, совместимости и целостности.
Но если у вас есть выбор выбрать один для другого или вы хотите или хотите явно использовать только конкретный, вы всегда должны работать с тем, который соответствует его назначению и строго различать.