Цей протокол бере свій початок ще з часів телерайтсменів. CR означає «повернення каретки» - символ керування CR повернув друкуючу голівку («карету») у стовпчик 0, не просуваючи папір. LF позначає "linefeed" - символ управління LF просунув папір на одну лінію, не переміщуючи друкуючу головку. Тож якщо ви хотіли повернути друкуючу голівку до нульового стовпця (готовий до друку наступного рядка) і просунути папір (щоб він друкувався на свіжому папері), вам потрібні і CR, і LF.
Якщо ви перейдете до різних документів Інтернет-протоколів, таких як RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) або RFC 2616 (HTTP), ви побачите, що всі вони визначають CR + LF як послідовність завершення рядка Отже, справжнє питання не "Чому CP / M, MS-DOS і Win32 використовують CR + LF як термінатор лінії?" а швидше "Чому інші люди вирішили відрізнятись від цих стандартних документів і використали інший лінійний термінатор?"
Unix прийняла звичайний LF як послідовність завершення рядків. Якщо ви подивитеся на варіанти stty, ви побачите, що опція onlcr вказує, чи слід змінити LF на CR + LF. Якщо ви невірно встановили це налаштування, ви отримаєте текст сходів, куди
each
line
begins
де попередній рядок відключений. Тож навіть Unix, залишаючи в режимі «необроблений», вимагає CR + LF для припинення рядків. Неявна CR перед LF - це unix винахід, ймовірно, як економія, оскільки вона економить один байт на рядок.
Unix родовід мови С переніс цю конвенцію в стандарт мови C, що вимагає лише "\ n" (який кодує LF) для завершення рядків, що покладає тягар на бібліотеки виконання, щоб перетворити необроблені файлові дані в логічні рядки.
Мова С також ввела термін "нова лінія" для вираження поняття "загальний термінатор лінії". Мені кажуть, що комітет ASCII змінив ім'я символу 0x0A на "новий рядок" близько 1996 року, тому рівень плутанини піднявся ще вище.
\r\n
. Він також використовується більшістю текстових інтернет-протоколів (наприклад, SMTP, HTTP тощо) здебільшого з тієї ж причини, що і Windows (тобто історія).