Різниця між \ n і \ r?


609

Чим відрізняється \n(нова лінія) від \r(повернення вагона)?

Зокрема, чи є практичні відмінності між \nі \r? Чи є місця, де слід використовувати один замість іншого?


3
Усі відповіді досить передбачувані, але мені було б цікаво дізнатися, чи є якісь ПРАКТИЧНІ розбіжності між \ n та \ r. Чи є місця, де одну слід використовувати над іншою?
Влад Імпала

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

2
так, деякі програми консолі Linux використовуються для анімації обертових ліній.
Муралі

8
Чи справді все ще нормальний Mac EOL? Я впевнений, що це було для "Класичного" Mac, але я думав, що ОС X Unixified. (Показує, наскільки я знайомий з Маком, так?)
Іоанн Y

11
історично \ n використовувались для переміщення каретки вниз, тоді як \ r використовувались для переміщення каретки назад на ліву частину сторінки.
karthik gorijavolu

Відповіді:


827

Щодо коду ascii, це 3 - оскільки вони відповідно 10 та 13 ;-).

Але серйозно, їх багато:

  • в Unix та всіх системах, схожих на Unix, \nє кодом для кінцевих рядків, \rнічого не означає
  • як наслідок, у C та більшості мов, які так чи інакше копіюють його (навіть віддалено), \nє стандартною послідовністю виходу для кінця рядка (перекладається у / з послідовностей, що стосуються ОС, за потреби)
  • у старих системах Mac (до OS X), \rнатомість був кодом для кінця рядка
  • в Windows (і багатьох старих ОС) код для кінця рядка - 2 символи \r\n, в такому порядку
  • як (дивно ;-) наслідком (повернення до ОС набагато старше Windows), \r\nє стандартним завершенням рядків для текстових форматів в Інтернеті
  • для електромеханічних телетайпоподібних "терміналів", \rкомандує вагончиком повернутися ліворуч до тих пір, поки він не потрапить на крайній лівий стоп (повільна робота), \nнакаже валикові прокрутити один рядок (набагато швидша робота) - ось чому ви завжди маєте \r раніше \n , щоб валик міг рухатись, поки вагон все ще їде ліворуч! -) У Вікіпедії є більш детальне пояснення .
  • для терміналів символьного режиму ( як правило емуляція навіть більш старі-друку , як вище), в нестандартному режимі, \rі \nдіє аналогічно ( за винятком того, як з точкою зору курсору, так як немає ні каретки або валика ;-)

На практиці, в сучасному контексті запису до текстового файлу, ви завжди повинні використовувати \n(базовий час виконання переводить, що якщо ви перебуваєте в дивної ОС, наприклад, Windows ;-). Єдина причина використовувати \r- якщо ви пишете в символьний термінал (або, швидше за все, "вікно консолі", що емулює його), і ви хочете, щоб наступний рядок, який ви пишете, перезаписав останній, який ви тільки що написали (іноді використовується для goofy "анімації ascii "ефекти, наприклад, бари прогресу) - однак це стає досить застарілим у світі графічних інтерфейсів ;-).


12
Щоб додати в історію в цій відповіді: оскільки швидкість лінії збільшилася з 10 символів в секунду, потрібно більше 2 -х символи стоять часу для перевезення на повернення і додаткові нешкідливі символів (зазвичай NUL тобто \0) були додані після того , як \nдозволити Зайвий час. Операційна система це обробляла прозоро, тому в застарілому коді ви не знайдете жодних слідів.
Марк Викуп

11
Як Windows "дивна" операційна система?
mailmindlin

31
@mailmindlin - ви запитуєте "Як Windows" дивна "операційна система?". Відповідь: більше способів, ніж я можу легко порахувати (під час носіння шкарпеток, тому пальці ніг не дозволені :-). Усі інші ОС, що пережили ОС, базуються на Unix ... Windows виходить, WAY багато в чому. У цьому конкретному контексті Q - це єдиний, що представляє ДВА байта (\ n \ r) як канонічний рядок ... без жодної розумної причини, за винятком давньоісторичних, пояснених деінде в потоці ... всі інші ОС має єдиний рядок char a5 (99% + з них `\ n ').
Алекс Мартеллі

1
@nothingisne необходимо: Наприклад, tools.ietf.org/html/rfc5322 , який замінив RFC 2822, визначаючи формат повідомлень електронної пошти.
Кіт Томпсон

3
Невелика порада всім, хто напише якийсь синтаксичний синтаксичний аналіз в якийсь момент свого життя - ніколи не забудьте правильно обробити закінчення рядків. У мене був досить неприємний досвід з цим лише тому, що я забув про \r(я використовую Linux). Після того, як я почав розбирати файл, який видався дійсним, мій аналізатор не вдався, оскільки файл, який я розбирав, був створений в Windows. : D Основною проблемою в усьому , що є то , що ні один, \nабо \rвидимі в тому сенсі , що, наприклад a, ., і (т.д. символи.
rbaleksandar

122

Історично "a" \nвикористовувався для переміщення вагона вниз, тоді як "" \r- для переміщення вагона назад на ліву частину сторінки.


8
Можливо, не дуже страшна практична відповідь на питання комп’ютера, але історичний примх все одно отримує відгук від мене.
Джон Y

1
Уявіть, що це схоже на те, коли ви натискаєте набравши частину фізичної машинки для введення ліворуч. повернення.
Джо Смо

2
\ n не переміщує каретку вниз, вона повертає валик для переміщення паперу вгору.
Родді

5
Весь рух відносний. Папір - це мій світ, і відносно нього вагон рухається вниз: P
tster

2
FWIW, все ще може бути "поверненням перевезення" в сучасних системах. Розглянемо цей код C printf("abcdefghijlm\rNOP\n");Скомпільований з gcc-8 на OpenSuSe і запуск на терміналі призводить до цього виводу NOPdefghijlm. \ R (повернення каретки) у рядку призводить до переміщення курсору на початок рядка (каретки), а символи, що слідують за \ r (тобто "NOP"), перезаписують те, що раніше було там (тобто "abc")! Ви можете домогтися подібного "перевезення вагоном" за допомогою printf("abcdefghijlm\b\bNOP\n");abcdefghijNOP
зворотного простору

36

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

\n використовується як термінатор кінцевих рядків у текстових файлах Unix

\r використовується як термінатор кінця рядка в текстових файлах Mac

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


2
Зауважте, що є / були комп'ютери, які використовували \ n \ r як маркер кінця рядка, коли ви натискали клавішу ENTER, як і Acorn та RISC OS.
Андерс

9
Для уточнення: \rдавно не було закінчення рядків на Mac. З випуском Mac OS X в 2001 році (який базується на Unix), \nтепер використовується.
jbbuckley

3
Але деякі програми, які використовують \r- наприклад, MS Office 2011 Excel: Збереження CSV (з усіма типовими налаштуваннями) - збереже файл закодованого ISO-8859-1 із \rзакінченням -line.
CodeBrauer

24

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

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

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


3
Стандарт ASCII для нового рядка - \ r \ n. (Крім короткого інтервалу, коли Bell Telephone отримав контроль над комітетом зі стандартів). У відповідь на монополію на телефон, Bell Telephone відмовився від роботи з повідомленнями (телеграма, телетайп) і не піклувався про існуюче використання стандарту. HTTP, HTML, PCDOS і MSDOS використовували стандарт ASCII. Bell Telephone вирішив стати нестандартним для Unix, оскільки у них не було сумісного з існуючим бізнесом.
Девід

12

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

\n Unix

\r Мак

\r\n Windows та DOS.


10
Я думаю, що ви плутаєте додаткові протоколи, TCP / IP поняття не має \ n і \ r.
jean-loup

4
TCP / IP не вимагає використання \ r \ n. Для цього потрібні різні протоколи, засновані на Telnet, зокрема SMTP, POP3, FTP, HTTP, ...
Маркіз Лорн

9

Завершувати,

У сценарії оболонки (bash) ви можете використовувати \rдля надсилання курсору спереду в рядку і, звичайно, \nдля того, щоб поставити курсор у новий рядок.

Наприклад, спробуйте:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Перший дисплей "відлуння" AA--AA
  • Другий : AA--AABB
  • Останній : BB--AABB

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


5

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

Трохи історії

/ R означає "повернення" або "повернення вагона", що завдячує історією машинці. Повернення вагона перемістило вашу коляску вправо, щоб ви набрали на початку рядка.

/ N означає «новий рядок», знову ж таки, з днів друкарської машинки ви перейшли вниз до нового рядка. Але не обов'язково до початку цього, хоча саме деякі ОС сприйняли необхідність повернення / виводу з подальшим новим рядком / n, як це було в порядку друкарської машини. Це також пояснює старі 8-бітові комп'ютери, які використовували мати "Повернення", а не "Вхід", з "повернення вагона", яке було знайоме.


1

Для додання плутанини я працював над простим текстовим редактором, використовуючи елемент 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 на 64-розрядному Windows 7.

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

Конвенції, описані у вищезазначених публікаціях, застосовуються до консольного виводу, але елементи HTML, схоже, дотримуються конвенції UNIX / Linux. Якщо хтось не виявить інше на іншій платформі / браузері.


0
#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
Це працює лише в тому випадку, якщо ваша підкреслена ОС надсилає \ r \ n, коли ви натискаєте клавішу ENTER, наприклад MS DOS, DECS TOPS-10, CP / M, RT-11 тощо. В ОС: такі як Multic, Unix і Unix-подібні ( Linux, Minix тощо) Клавіша BeOS, RISCOS тощо ENTER надсилає вам лише \ n символ.
Андерс

1
ах так, старі добрі часи, коли на клавіатурах було і те, Returnі Enter. Навіть на моїй сучасній бездротовій клавіатурі все ще відображається стрілка вниз і назад на старій Returnклавіші (яка тепер має назву "Enter", щоб відповідати клавіші цифрової клавіатури Enter, на якій не показана стрілка)
нічого не потрібно

0

Яка різниця між \ n (нова лінія) та \ r (повернення каретки)?

Зокрема, чи є практичні відмінності між \nі \r? Чи є місця, де слід використовувати один замість іншого?


Я хотів би зробити короткий експеримент із відповідними послідовностями втечі \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 

Помітили, де різниця? Різниця полягає лише в тому, що, коли ви використовуєте послідовність аварійного повернення каретки \rв кінці кожної послідовності друку, наступна ітерація цієї послідовності не потрапляє в наступний текстовий рядок - Наприкінці кожної послідовності друку курсор не зробив перейшов до * початку наступного рядка.

Натомість курсор відскочив назад до початку рядка, на якому він опинився в кінці, перш ніж використовувати \rсимвол. - Результат полягає в тому, що кожна наступна ітерація послідовності друку замінює попередню.

* Примітка. A \nне обов'язково переходити до початку наступного рядка тексту. У деяких, взагалі більш старих, операційних систем результатом \nсимволу нового рядка може бути те, що він переходить до будь-якого місця в наступному рядку, а не лише до початку. Ось чому їх потрібно використовувати, \r \nщоб отримати на початку наступного рядка тексту.


Цей експеримент показав нам різницю між новою лінією та поверненням каретки в контексті виходу ітерації послідовності друку.

Обговорюючи інформацію про вхід в програму, деякі термінали / консолі можуть перетворити повернення каретки в новий рядок неявно для кращої портативності, сумісності та цілісності.

Але якщо у вас є вибір вибрати одну для іншої, або ви хочете або потрібно явно використовувати лише конкретну, ви завжди повинні оперувати тим, який відповідає його призначенню і чітко розрізняти між собою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.