В чем разница между \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--AAAA--AABBBB--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чтобы получить в начале следующей текстовой строки.
Этот эксперимент показал нам разницу между переводом строки и возвратом каретки в контексте вывода итерации последовательности печати.
При обсуждении ввода в программу некоторые терминалы / консоли могут неявно преобразовывать возврат каретки в новую строку для лучшей переносимости, совместимости и целостности.
Но если у вас есть выбор выбрать один для другого или вы хотите или хотите явно использовать только конкретный, вы всегда должны работать с тем, который соответствует его назначению и строго различать.