#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 во время выполнения языка, которые не предлагают виртуальную новую строку.