Чим відрізняється \n
(нова лінія) від \r
(повернення вагона)?
Зокрема, чи є практичні відмінності між \n
і \r
? Чи є місця, де слід використовувати один замість іншого?
Чим відрізняється \n
(нова лінія) від \r
(повернення вагона)?
Зокрема, чи є практичні відмінності між \n
і \r
? Чи є місця, де слід використовувати один замість іншого?
Відповіді:
Щодо коду ascii, це 3 - оскільки вони відповідно 10 та 13 ;-).
Але серйозно, їх багато:
\n
є кодом для кінцевих рядків, \r
нічого не означає\n
є стандартною послідовністю виходу для кінця рядка (перекладається у / з послідовностей, що стосуються ОС, за потреби)\r
натомість був кодом для кінця рядка\r\n
, в такому порядку\r\n
є стандартним завершенням рядків для текстових форматів в Інтернеті\r
командує вагончиком повернутися ліворуч до тих пір, поки він не потрапить на крайній лівий стоп (повільна робота), \n
накаже валикові прокрутити один рядок (набагато швидша робота) - ось чому ви завжди маєте \r
раніше \n
, щоб валик міг рухатись, поки вагон все ще їде ліворуч! -) У Вікіпедії є більш детальне пояснення .\r
і \n
діє аналогічно ( за винятком того, як з точкою зору курсору, так як немає ні каретки або валика ;-)На практиці, в сучасному контексті запису до текстового файлу, ви завжди повинні використовувати \n
(базовий час виконання переводить, що якщо ви перебуваєте в дивної ОС, наприклад, Windows ;-). Єдина причина використовувати \r
- якщо ви пишете в символьний термінал (або, швидше за все, "вікно консолі", що емулює його), і ви хочете, щоб наступний рядок, який ви пишете, перезаписав останній, який ви тільки що написали (іноді використовується для goofy "анімації ascii "ефекти, наприклад, бари прогресу) - однак це стає досить застарілим у світі графічних інтерфейсів ;-).
\0
) були додані після того , як \n
дозволити Зайвий час. Операційна система це обробляла прозоро, тому в застарілому коді ви не знайдете жодних слідів.
\r
(я використовую Linux). Після того, як я почав розбирати файл, який видався дійсним, мій аналізатор не вдався, оскільки файл, який я розбирав, був створений в Windows. : D Основною проблемою в усьому , що є то , що ні один, \n
або \r
видимі в тому сенсі , що, наприклад a
, .
, і (
т.д. символи.
Історично "a" \n
використовувався для переміщення вагона вниз, тоді як "" \r
- для переміщення вагона назад на ліву частину сторінки.
printf("abcdefghijlm\rNOP\n");
Скомпільований з gcc-8 на OpenSuSe і запуск на терміналі призводить до цього виводу NOPdefghijlm
. \ R (повернення каретки) у рядку призводить до переміщення курсору на початок рядка (каретки), а символи, що слідують за \ r (тобто "NOP"), перезаписують те, що раніше було там (тобто "abc")! Ви можете домогтися подібного "перевезення вагоном" за допомогою 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
Unix
\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 переміщується на початок поточного рядка, не переходячи до наступного рядка. Я використовував \ n у власних консольних програмах, де я тестую якийсь код, і не хочу, щоб текст прокручувався на моєму екрані, а не використовувати \ n після друку якогось тексту, скажімо, частоти кадрів ( FPS), я виведу printf ("% - 10d \ r", fps); Це поверне курсор на початок рядка, не переходячи до наступного рядка, і дозволить мені мати іншу інформацію на екрані, яка не прокручується, а частота кадрів постійно оновлюється в тому ж рядку (% -10 робить певний вихід має принаймні 10 символів, залишений виправданим, щоб він закінчувався пробілами, переписуючи будь-які старі значення для цього рядка). Це дуже зручно для таких речей,
Трохи історії
/ R означає "повернення" або "повернення вагона", що завдячує історією машинці. Повернення вагона перемістило вашу коляску вправо, щоб ви набрали на початку рядка.
/ N означає «новий рядок», знову ж таки, з днів друкарської машинки ви перейшли вниз до нового рядка. Але не обов'язково до початку цього, хоча саме деякі ОС сприйняли необхідність повернення / виводу з подальшим новим рядком / n, як це було в порядку друкарської машини. Це також пояснює старі 8-бітові комп'ютери, які використовували мати "Повернення", а не "Вхід", з "повернення вагона", яке було знайоме.
Для додання плутанини я працював над простим текстовим редактором, використовуючи елемент 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. Якщо хтось не виявить інше на іншій платформі / браузері.
#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
? Чи є місця, де слід використовувати один замість іншого?
Я хотів би зробити короткий експеримент із відповідними послідовностями втечі \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
щоб отримати на початку наступного рядка тексту.
Цей експеримент показав нам різницю між новою лінією та поверненням каретки в контексті виходу ітерації послідовності друку.
Обговорюючи інформацію про вхід в програму, деякі термінали / консолі можуть перетворити повернення каретки в новий рядок неявно для кращої портативності, сумісності та цілісності.
Але якщо у вас є вибір вибрати одну для іншої, або ви хочете або потрібно явно використовувати лише конкретну, ви завжди повинні оперувати тим, який відповідає його призначенню і чітко розрізняти між собою.