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

#java #visual-studio

Вопрос:

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

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

Комментарии:

1. Все ответы довольно предсказуемы, но мне было бы интересно узнать, есть ли какие-либо ПРАКТИЧЕСКИЕ различия между n и r. Есть ли места, где одно следует использовать поверх другого?

2. ну да, текстовые файлы только с LF (новой строкой) не будут рассматриваться как завершенные в некоторых приложениях Windows, а текстовые файлы, завершенные с помощью CRLF, будут отображаться с дополнительными символами, если их открыть в некоторых приложениях Linus.

3. да, r используется некоторыми консольными приложениями Linux для анимации вращающихся линий.

4. Действительно ли r все еще является нормальным Mac EOL? Я уверен, что это было для «классического» Mac, но я думал, что OS X была унифицирована. (Показывает, насколько я знаком с компьютерами Mac, а?)

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

Ответ №1:

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

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

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

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

Комментарии:

1. Чтобы добавить в историю в этом ответе: поскольку скорость строки увеличилась с 10 символов в секунду, для возврата каретки потребовалось более 2 символов, а дополнительные безвредные символы (обычно нулевые, т. Е. ) были добавлены после n , чтобы предоставить дополнительное время. Это было прозрачно обработано операционной системой, поэтому вы не найдете никаких следов этого в устаревшем коде.

2. Как Windows может быть «странной» операционной системой?

3. @mailmindlin-вы спрашиваете: «Почему Windows является «странной» операционной системой?». Ответ: в большем количестве способов, чем я могу легко сосчитать (во время ношения носков, поэтому пальцы ног запрещены:-). Все остальные сохранившиеся ОС основаны на Unix… Окна-это единственный выход, ВЫХОД во многих отношениях. В этом конкретном контексте Q-это единственный, который содержит ДВА байта (nr) в качестве канонического конца строки… без всякой разумной причины, кроме древнеисторических, объясненных в другом месте в потоке… каждая другая ОС имеет один символ в конце строки (99% из них «n»).

4. Небольшой совет всем, кто в какой — то момент своей жизни напишет какой-нибудь парсер-никогда не забывайте правильно обрабатывать окончания строк. У меня был довольно неприятный опыт с этим только потому, что я забыл о r (я использую Linux). Как только я начал анализировать то, что казалось допустимым файлом, мой анализатор вышел из строя, потому что файл, который я анализировал, был создан в Windows. 😀 Главная проблема во всем этом заключается в том, что ни n то , ни r другое не видны в том смысле, что, например a , . , ( и т. Д. персонажи есть.

5. «Все остальные выжившие ОС основаны на Unix», что неудивительно, учитывая, что все они являются просто некоторой перестановкой Unix. Это все равно, что сказать, что ваниль-странный вкус мороженого, потому что 100 человек решили посыпать свое шоколадное мороженое 100 различными начинками и таким образом создали 100 различных вкусов. Я действительно устаю от людей, сравнивающих WIndows и Unix, как будто они должны быть альтернативами друг другу. Это все равно что сравнивать спортивный автомобиль с трактором, потому что оба они являются автомобилями. А потом заявлять, что одно лучше другого, и точка.

Ответ №2:

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

Комментарии:

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

2. Представьте, что r будет похож на то, когда вы нажимаете печатающую часть вашей физической печатающей машины влево, иначе говоря. Возврат.

3. n не перемещает каретку вниз, он поворачивает ролик, чтобы переместить бумагу ВВЕРХ.

4. Всякое движение относительно. Бумага-это мой мир, и по отношению к ней карета движется вниз 😛

5. FWIW, r все еще может быть «Возвратом каретки» в современных системах. Рассмотрим этот код C printf("abcdefghijlmrNOPn"); , скомпилированный с помощью gcc-8 в openSUSE, и запуск на терминале приведет к этому результату NOPdefghijlm . r (возврат каретки) в строке приводит к перемещению курсора в начало строки (каретка), а символы, следующие за r (т. е. «NOP»), перезаписывают то, что было ранее (т. е. «abc»)! Вы можете добиться аналогичного «перемещения каретки» с помощью backspace (b), как в printf("abcdefghijlmbbNOPn"); случае, когда abcdefghijNOP

Ответ №3:

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

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

r Исторически (до OS X) использовался в качестве терминатора конца строки в текстовых файлах Mac

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

Комментарии:

1. Обратите внимание, что есть/были компьютеры, которые использовали nr в качестве маркера конца строки при нажатии клавиши ВВОДА, например, Acorn и RISC OS.

2. Чтобы уточнить: r на Mac уже давно не заканчивалась строка. С выпуском Mac OS X в 2001 году (которая основана на Unix), n в настоящее время используется.

3. Но все еще есть некоторые приложения, использующие r — например, MS Office 2011 Excel: Сохранение CSV (со всеми настройками по умолчанию) — сохранит файл в кодировке ISO-8859-1 с r окончаниями строк.

Ответ №4:

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

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

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

Комментарии:

1. Стандарт ASCII для новой строки — rn. (За исключением короткого промежутка времени, когда Bell Phone получил контроль над комитетом по стандартам). В обмен на телефонную монополию Bell Telephone отказалась от бизнеса обмена сообщениями (телеграмма, телетайп) и не заботилась о существующем использовании стандарта. HTTP, HTML, PCDOS и MSDOS использовали стандарт ASCII. Bell Telephone решил пойти нестандартно для unix, потому что у них не было существующего бизнеса, с которым можно было бы быть совместимым.

Ответ №5:

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

n Unix

r Mac

rn Windows и DOS.

Комментарии:

1. Я думаю, вы путаете прикладные протоколы, TCP/IP понятия не имеет о n и r .

2. TCP/IP не требует использования rn. Этого требуют различные протоколы, основанные на Telnet, включая SMTP, POP3, FTP, HTTP,…

Ответ №6:

Завершить,

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

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

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

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

Ответ №7:

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

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

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

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

Ответ №8:

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

Однако я обнаружил кое-что интересное при проверке фактических символов, содержащихся в текстовой области, с помощью небольшой функции 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 на 64-разрядной версии Windows 7.

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

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

Ответ №9:

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

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


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

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

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


Программа новой линии:

 #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 в начале следующей текстовой строки.


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

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

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

Ответ №10:

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

Комментарии:

1. Это работает только в том случае, если ваша подчеркивающая ОС отправляет rn при нажатии клавиши ВВОДА, например MS DOS, DECS TOPS-10, CP/M, RT-11 и т. Д. В ОС:es, такие как Multic, Unix и Unix-подобные(Linux, Minix и т. Д.), BeOS, RISCOS и т. Д. Ввод ключа только отправляет вам символ n.

2. ах да, старые добрые времена, когда на клавиатурах было и Return то, и Enter другое . Даже на моей современной беспроводной клавиатуре по-прежнему отображается стрелка вниз и назад на старой Return клавише (которая теперь называется «Ввод», чтобы соответствовать клавише цифровой Enter клавиатуры, на которой стрелка не отображается).

3. В «современных языках» такие ошибки / проблемный код все еще могут быть очевидны при разделении строк на rn вместо r?n .. такие можно найти в кодовых базах Windows во время выполнения языка, которые не предлагают виртуальную новую строку.