Як по-різному обробляються \ n та \ r в Linux та Windows?


22

Я думаю, що \nрухає голкою вниз, а \rголку переміщує на початок рядка (вирівнюють ліворуч)? Я не впевнений, хоча. Тож, якщо я помиляюся, виправте мене ...

У всякому разі, мені сказали, що Windows і Linux справляються newlinesі по- carriage returnsрізному. Мені хотілося б знати, як вони по-різному поводяться з ними, і про деякі місця, де важливо пам’ятати. Дякую за відповідь.


Поки я знаю, що \r\nце добре в Windows, але \n\rце не так, і я пам’ятаю, що \r\nце абревіатура для зареєстрованої медсестри. Я також чую, що \nце те, що люди використовують в Linux, і \rне використовується одне лише з тією ж метою, що і \r\n. \rвикористовується в дійсно старих MacOS. Я не підтвердив цих фактів, хоча.
千里 ち ゃ ん

4
Не називайте їх \rі \n, так як \nобробляється , залежить від того, де ви його використовуєте. Краще зателефонувати їм CRі LF.
Ігнасіо Васкес-Абрамс

Ігнасіо, ці абревіатури для мене не мають значення. Як ви це називаєте: /? О ... ЛІНІЙНЕ ПОДАВАННЯ та ПОВЕРНЕННЯ ТРАНСПОРТІВ. Спасибі, sleske.
千里 ち ゃ ん

@ IgnacioVazquez-Abrams Чи \ n не тотожне LF? На будь-якій діаграмі ASCII, чи не символ 13 = \ n = LF?
барлоп

1
@barlop: Не виходить на C при виведенні в Windows.
Ігнасіо Васкес-Абрамс

Відповіді:


21

Я думаю, що \ n переміщує голку вниз, а \ r переміщує голку на початок рядка (вирівнювання ліворуч)? Я не впевнений, хоча

Це правда, більш-менш, але здебільшого історична цікавість. Спочатку передача ліній (LF) використовувалася для просування паперу одним рядком на принтерах та терміналах копіювання ( телепринтери ); повернення каретки (CR) повернуло друкуючу головку до початку рядка.

Це, мабуть, все ще працює на сучасних принтерах, коли вони використовуються в "текстовому режимі", але інакше сьогодні мало актуальні.

У всякому разі, мені сказали, що Windows та Linux обробляють нові лінії, а каретка повертається по-різному.

Різниця проста: дизайнерам ОС довелося вибирати, як представляти початок нового рядка з тексту в комп’ютерних файлах. З різних історичних причин у світі Unix / Linux один маркер LF був обраний як маркер нового рядка; MS-DOS обрав CR + LF, а Windows це успадкував. Таким чином, різні платформи використовують різні умови.

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

Є деякі випадки, коли інструменти наполягають на "їхній" конвенції про новий рядок (наприклад, сценарії оболонки Unix не повинні використовувати CR + LF), і в цьому випадку ви повинні використовувати правильний.


Той самий рядок опитування: чи розпізнають мови програмування \n\rта \nяк однакові? Наприклад, якщо я розбір текстового файлу , який був відредагований на чужому комп'ютері і містив як версію Linux і Windows , обривів лінії, виконуючи б, preg_matchдля \nі \n\rдати мені різні результати?
千里 ち ゃ ん

@ 千里 ち ゃ ん: Це повністю залежить від мови програмування, компілятора і т. Д. Зокрема, якщо ви використовуєте регулярні вирази, це буде залежати від двигуна регулярних виразів, який ви використовуєте - деякі розрізняють різні закінчення рядків, деякі - ні (більшість може бути налаштовано в будь-якому випадку, Я вірю).
sleske

@ 千里 ち ゃ ん: Якщо у вас є питання про те, як деяка система / мова програмування / система регулярних виразів обробляє різні конвенції нового рядка, просто задайте це як окреме питання.
sleske

ви повинні писати \ r \ n не так, як ви. Що стосується мов програмування, вони зможуть читати окремі символи, і ви, програміст, можете бачити, який використовується у вводі, а ви, програміст, також можете робити, як хочете, для виводу. Як ви могли сказати "Напишіть ABC з наступним \ r \ r \ r \ n" будь-якими символами, які ви хочете вставити на кінці! деякі інші символи можуть бути недрукованими і не мають графічного зображення. У них можуть бути вбудовані такі функції, як println, і те, що вони використовують для нового рядка, буде те чи інше, це не може бути обом.
барлоп

@ 千里 ち ゃ ん і деякі мови програмування можуть вам вибрати, який nie закінчується як налаштування в одній з їх вбудованих функцій, так що навіть у вбудованій функції ви могли б .. теоретично все одно. + як вже згадувалося, на практиці ви можете писати будь-який рядок, який закінчується. Хоча, можливо, ви не зможете зробити це так ефективно, як за допомогою функції println.
барлоп

14

CR та LF

Американський стандартний код обміну інформацією (ASCII) визначає символи управління, включаючи CARRIAGE-RETURN (CR) та LINE-FEED (LF), які використовувались (і досі використовуються) для управління положенням друку на принтерах аналогічно до механічні друкарські машинки, які передували раннім комп'ютерним принтерам.

Залежність від платформи

У Windows традиційним роздільником рядків у текстових файлах є CR, а потім LF

У старих системах (перед OSX) Apple Macintosh традиційним роздільником рядків у текстових файлах був CR

У Unix та Linux традиційний роздільник рядків у текстових файлах - LF.

\ n і \ r

У багатьох мовах програмування та сценаріїв \nозначає "новий рядок". Іноді (але не завжди) це означає символ ASCII LINE-FEED (LF), який, як ви кажете, переміщує курсор (або положення друку) вниз на один рядок. У принтері чи друкарській машинці це насправді перемістить папір на один рядок.

Незмінно \rозначає символ ASCII CARRIAGE-RETURN (CR), назва якого фактично походить від механічних машинок, де був ключ повернення каретки, який спричинив переміщення валика ("каретки"), який перевозив папір, вправо, що працює від пружини, наскільки це пішло б. Таким чином, встановивши поточну позицію набору лівого поля.

Програмування

У деяких мовах програмування \nможе означати залежна від платформи послідовність символів, які закінчуються або відокремлюють рядки в текстовому файлі. Наприклад, в Perl print "\n"виробляється інша послідовність символів в Linux, ніж у Windows.

У Java найкраща практика, якщо ви хочете використовувати нативні закінчення рядків для платформи виконання, - це не використовувати \nабо \rвзагалі. Ви повинні використовувати System.getProperty("line.separator"). Ви повинні використовувати \nта \rде ви хочете LF та CR незалежно від платформи (наприклад, як це використовується в протоколах HTTP, FTP та інших протоколах зв'язку в Інтернеті).

Unix stty

У оболонці Unix sttyкоманда може використовуватися для того, щоб оболонка перекладалася між цими різними умовами. Наприклад stty -onlcr, оболонка буде згодом переводити всі вихідні НЧ в CR LF.

Linux та OSX дотримуються конвенцій Unix

Текстові файли

Текстові файли як і раніше надзвичайно важливі та широко використовуються. Наприклад, HTML і XML - приклади текстового файлу. Більшість важливих інтернет-протоколів, таких як HTTP, дотримуються конвенцій текстових файлів і містять специфікації для закінчень рядків.

Принтери

Більшість принтерів, крім самого дешевого, все ще поважають CR та LF. Насправді вони є основними для найбільш широко використовуваних мов опису сторінок - PCL та Postscript.


1
Примітка щодо Java: Це, як правило, неправда, що ви "не повинні використовувати \ n або \ r взагалі". Просто в Java "\ n" завжди LF, а "\ r" - завжди CR. Це може бути саме те, що ви хочете: якщо ви хочете певного стилю закінчення рядка, використовуйте їх; якщо ви явно хочете нативний закінчення рядка комп'ютера ви працюєте на, а потім використовувати line.separator. Це дійсно залежить від того, що ти хочеш.
sleske

І BTW, println()автоматично використовує line.separator, тому якщо ви хочете println()закінчити рідні рядки, ви можете використовувати (а якщо вам потрібен певний тип закінчення рядка, тоді не використовуйте його, а використовуйте явно "\ n" тощо).
sleske

@sleske: Гарні моменти. Відповідно оновлю відповідь.
RedGrittyBrick

1
Чи є якісь мови чи компілятори, де \nкеруючий символ відрізняється від ASCII LF (крім систем на базі EBCDIC)? Я маю на увазі те, що \nозначає в рядку чи букве символу, а не на ефект надсилання його у файл чи вихідний пристрій.
Кіт Томпсон

1
@KeithThompson: Для Java: Так, \nце завжди ASCII (і Unicode) код 10, тому що JLS так прямо говорить (JLS 3.10.6, "Послідовності втечі для символів і рядкових літералів" - я перевірив :-)). Для інших мов - гарне запитання.
sleske

4

Коротше кажучи, це було потрібно для принтерів, але зараз ОС це роблять трохи інакше. У більшості випадків добре робити лише CR і LF, роблячи це, \r\nі в більшості випадків це буде добре.


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