Нагадування - \ r \ n чи \ n \ r?


390

Я просто не можу їх згадати. Отже, який правильний спосіб правильно припинити старомодні лінії ASCII?


11
Якщо ви це зробите, переконайтесь, що ви відкриваєте свої файли у двійковому режимі . В іншому випадку стандартні потоки файлів C / C ++ перетворять "\ n" (для текстових файлів (за замовчуванням)) у певну для послідовності платформи кінцеву послідовність (ELS). Таким чином, "\ r \ n" у Windows перетвориться на "\ r \ r \ n" на фізичному диску. Примітка: якщо ви просто використовуєте C / C ++ для того, щоб прочитати файл назад, ви не помітите, як ELS буде перетворений назад у "\ n" при читанні з файлу.
Мартін Йорк

@Martin - я перебуваю в .net, і використовую (для цього прикладу) File.AppendAllText, з "\ r \ n", і я просто переглянув файл, і немає дублювання в кінці лінія. Магія?
Даніель Мошмодор

@Daniel: Я повинен був бути більш конкретним. C / C ++ потоки. Коли він пов’язаний з файлом і відкритий у текстовому режимі . Це також залежить від того, як ви дивитесь на файл (використовуйте гексидатор).
Мартін Йорк

@Martin - використовував PSPad у шестигранному режимі ...
Даніель Мошмодор

1
На стародавніх клавіатурах клавішу Enter називали клавішею Return. Таким чином, повернення прийшло першим, потім Linefeed був створений у відповідь. Це все так очевидно, коли у вас занадто багато історії.
Марк Викуп

Відповіді:


1084

Я б використовував слово ' r etur n ', щоб пам’ятати, r приходить перед n.


116
І щоб пам’ятати, що слово для вживання - повернення , пам’ятайте, що \ r повернення вагона . Не пам’ятайте, що "Return" - це назва клавіші на клавіатурах Mac, інакше ви згодом можете переглянути клавіатуру ПК, побачити клавішу під назвою "Enter" і неправильно визначити порядок букв!
Роб Кеннеді

3
@David Але мені було цікаво, що цей ефект \n\rі \r\nтакий же, хіба вони не роблять однакового ефекту? ви можете сказати різницю?
Містер Анубіс

7
@ Mr.Anubis, якщо у вас є певний матричний принтер, різниці не повинно бути, оскільки порядок команд не має бути важливим. Однак на деяких принтерах ви отримаєте додаткові порожні рядки або взагалі відсутність просування по лінії. І все, що сказане вище, стосується текстових редакторів - вони будуть заплутані, заняття TextStream захворіють тощо. Замовити IS важливо. :)
Даніель Мошмодор

12
@ DanielMošmondor Як варіант, ви можете просто пам'ятати, що замовлення є impoRtaNt. Або що коли ви запитали у SO, хтось подарував вам RemiNder, який ви згодом забули. Або що ви не можете використовувати своє прізвище як нагадування, тому що порядок r і n там перетворений :)
Даніель Даранас

5
@RobKennedy ха-ха, ти знаєш, що я прийшов сюди і читав про повернення, і думав "чудово!". Потім я прочитав ваш коментар. Тепер кожен раз, коли я не можу пригадати, на яку клавішу я не повинен дивитись - я дивлюсь на свою клавішу "Enter" і думаю, що "тут щось не так" ... ха-ха, думаючи про це!
Уейн Урода

53

Якщо ви використовуєте C #, ви повинні використовувати Environment.NewLine, що відповідно до MSDN це:

Рядок, що містить "\ r \ n" для платформ, які не є Unix, або рядок, що містить "\ n" для платформ Unix.


46
Насправді такий вид залежить від того, що ти робиш. Якщо ви просто виводите звичайний текст на консоль або у файл для місцевого використання, Environment.NewLineце добре. Однак якщо ви пишете речі у чітко визначеному форматі, формат може визначати і новий рядок. Наприклад, протокол HTTP повідомляє, що ви повинні використовувати \r\nяк термінальний рядок для заголовків тощо, незалежно від платформи.
Матті Вірккунен

3
Так, це справді погана порада.
IvanP

Ось чому вам потрібно уникнути своїх веб-повідомлень і скласти тести одиниць, щоб перевірити, чи \ r \ n (windows), \ r (mac), \ n (linux) надсилає належним чином як \ r \ n веб-серверу.
TamusJRoyce

37

Новий рядок залежить від вашої ОС:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Детальніше тут: https://ccrma.stanford.edu/~craig/utility/flip/

Якщо ви сумніваєтеся, використовуйте будь-який безкоштовний шестигранний переглядач / редактор, щоб побачити, як файл кодує його новий рядок.

Для мене я використовую наступний посібник, щоб допомогти мені запам'ятати: 0D0A = \ r \ n = CR, LF = ca rr iage r eturn, li n e feed


7
Як не дивно, я одна з цих людей, яка знає 0D0Aнапам’ять, але все ще плутає \rі \n.
Nyerguds

1
Або я пам’ятаю, що \ r - повернення вагона і \ n - подача рядків ... просто я не пам'ятаю їх порядок, тому це не допомагає згадати, який з них 0D, а який - 0A;)
Nyerguds

20

Послідовність CR (Carriage Return) - LF (Подача рядків). Пам'ятаєте матричні принтери? Саме так. Отже - правильний порядок - \ r \ n


Я думаю, що це найбільш логічна відповідь
Девід Снабель-Конт

12
LF + CR буде робити те саме CR + LF на принтерах.
ikegami

10
Я не згоден, @David. Просто думати про точкові матричні принтери (або друкарські машинки, з цього приводу, оскільки саме вони мають коляску для повернення) недостатньо. Маючи лише основну інформацію про те, як вони працюють, немає причин вважати, що це важливо, чи ми просуваємо папір до або після повернення до початку рядка. І \ r \ n і \ n \ r ставлять папір у однакове положення.
Роб Кеннеді

@ikegami на більшості принтерів, а не на всіх. Вони також мали DIP-комутатори для налаштування такої поведінки. :)
Даніель Мошмодор

5
Однією з причин розміщення каналу лінії після повернення вагона є те, що скорочується загальна кількість часу, необхідне - поки голова повертається до лівого краю паперу, валик може вказувати один рядок. Більш довга операція починається спочатку, тому вся операція завершується за той час, який потрібно довше виконувати. Ми зробили багато речей з таких причин; уявіть, чекайте пару сотень рядків на 110 бод ...
Джеррі Ендрюс

8

У будь-якому .NET-мові Environment.NewLineбуло б кращим.


Не працює для постійних рядків. За потреби краще не використовувати константи та використовувати статичну струну замість цього;)
TamusJRoyce

5

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

Насправді мова йде про послідовність завершення лінії LTS, яка є специфічною для платформи.

Якщо ви відкриєте файл у текстовому режимі (тобто не двійковому), то потоки перетворять "\ n" у правильний LTS для вашої платформи. Потім перетворіть LTS назад у "\ n", коли ви прочитаєте файл.

У результаті, якщо ви надрукуєте "\ r \ n" у файл Windows, ви отримаєте послідовність "\ r \ r \ n" у фізичному файлі (ознайомтесь із шестигранним редактором).

Звичайно, це справжній біль, коли справа стосується передачі файлів між платформами.

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


4

\r\n для Windows буде добре.


Сингл \nвідмінно працює і у Windows, включаючи останню версію Notepad.
Андре Карон

Я думаю, що сучасні редактори виявлять закінчення рядків, оскільки різні ОС використовують різні закінчення.
Девід Снабел-Конт

1
Насправді ні: Якщо ви надрукуєте це у файл (файл std C / C ++, відкритий у текстовому режимі) у Windows, фізичний файл буде містити "\ r \ r \ n" (перевірте це з шестигранним редактором). Коли ви читаєте його назад, "\ r \ n" перетворюється назад в єдине "\ n".
Мартін Йорк

2
Насправді, @DavidCaunt, я просто спробував \ n, і це не працює з блокнотом на Win8.
Філк

4

З Вікіпедії (ви можете прочитати, що правильно для вашої ОС у цій статті):

Системи, засновані на ASCII або сумісному наборі символів, використовують або LF (канальний рядок, '\ n', 0x0A, 10 у десятковій частині), або CR (повернення каретки, '\ r', 0x0D, 13 у десятковій частині) окремо, або CR з наступним LF (CR + LF, '\ r \ n', 0x0D0A).


3

\r\n

Як не дивно сказати, я пам’ятаю це, тому що це протилежне машинці, яку я використовував.
Добре, якщо це було нормально, мені не потрібно було це пам'ятати ...:-)

друкарська машинка з Вікіпедії * Зображення з Вікіпедії

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

Ви можете слухати з цього запису з сайту freesound.org звук подачі паперу на початку та приблизно через 1: 03 секунди від кінця, після попередження про дзвінок про закінчення рядка звучання барабана, який котиться і після повернення вагона.


2

якщо ви використовуєте C #, чому б не використовувати Environment.NewLine? (я припускаю, що ви використовуєте деякі об'єкти файлозаписувача ... просто передайте його, Environment.NewLineі він буде обробляти потрібні термінатори.

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