LF (Line Feed) и CRLF (Carriage Return + Line Feed) — это символы, которые используются для обозначения конца строки в текстовых файлах.
Основная разница между LF и CRLF заключается в том, что CRLF состоит из двух символов: возврата каретки (CR) и перевода строки (LF). Это стандартный формат конца строки в операционных системах Windows, в то время как LF является стандартным форматом для операционных систем Unix и macOS.
Управление символами конца строки может быть проблематичным, особенно при работе с текстовыми файлами на различных платформах.
Чтобы бороться с этими различиями в формате конца строки, вы можете использовать различные подходы:
1. Универсальный подход: Вы можете использовать специальные библиотеки или инструменты, такие как «dos2unix» или «unix2dos», для преобразования формата конца строки между CRLF и LF или наоборот. Эти инструменты автоматически настраивают формат конца строки согласно целевой платформе.
2. Установка правильных параметров при работе с файлами: При создании, чтении или записи файлов в коде, вы можете использовать соответствующие параметры или флаги для управления форматом конца строки. Например, в Python вы можете открыть файл с параметром «newline=»» для автоматического обнаружения формата конца строки.
3. Ручная замена: Если у вас есть файлы с неправильным форматом конца строки, вы можете воспользоваться текстовым редактором или скриптом для замены символов конца строки. Например, в текстовом редакторе Sublime Text вы можете выбрать опцию «View -> Line Endings» и выбрать нужный формат конца строки.
Конвертировать строки с использованием LF в CRLF в JavaScript можно с помощью следующего кода:
function convertToCRLF\(input\) {
return input.replace\(/\n/g, '\r\n'\);
}
const textLF = "Пример текста\nс использованием LF";
const textCRLF = convertToCRLF\(textLF\);
console.log\(textCRLF\);
В этом примере мы используем регулярное выражение `/n/g`, чтобы найти все вхождения символа LF (`\n`) и заменить их на CRLF (`\r\n`).
Аналогично, чтобы конвертировать строки с использованием CRLF в LF, можно использовать следующий код:
function convertToLF\(input\) {
return input.replace\(/\r\n/g, '\n'\);
}
const textCRLF = "Пример текста\r\nс использованием CRLF";
const textLF = convertToLF\(textCRLF\);
console.log\(textLF\);
Здесь мы используем регулярное выражение `/r\n/g`, чтобы найти все вхождения CRLF (`\r\n`) и заменить их на LF (`\n`).
Обратите внимание: кодировка символов конца строки может варьироваться в зависимости от платформы и окружения, поэтому важно учитывать контекст, в котором вы работаете, при обработке символов конца строки.
Пройдите тест, узнайте какой профессии подходите
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы
CRLF 🚀 – это как «точка с запятой» для текста в компьютере, говорящая «начни новую строку». В мире веба, злоумышленники могут использовать CRLF для взлома, но есть способы защиты.
CRLF помогает разделять заголовки и тело в HTTP-ответах, делая веб-коммуникацию четкой и понятной. Это ключ к пониманию, как данные передаются в интернете. 🌐
Понимание CRLF упрощает написание программ, помогает избежать ошибок при работе с текстом и защищает от уязвимостей. Знание о том, как данные разделяются и передаются, критично для безопасности и эффективности веб-приложений. 🔐📈
Пример
Представьте, что вы пишете письмо другу и хотите, чтобы оно выглядело аккуратно и структурированно. В вашем письме есть приветствие, основная часть и прощание. Чтобы разделить эти части, вы используете пустые строки. В мире компьютеров для создания таких разделов в тексте используются специальные символы – CRLF (\r\n
).
👉 Пример в коде:
Предположим, вы хотите отправить данные о заказе в интернет-магазине через HTTP-запрос и хотите, чтобы информация была структурирована для удобства чтения:
В этом примере \r\n
(CRLF) используется для разделения заголовков HTTP-запроса от тела запроса, а также для структурирования самого тела запроса, делая его более читаемым и понятным как для человека, так и для компьютера.
Таким образом, CRLF служит важной функцией в организации данных, позволяя нам четко разделять различные части сообщения или документа.

Основы CRLF: разделители строк в цифровом мире
Что такое CRLF и как это работает? В основе своей, CRLF – это сочетание двух символов: возврата каретки (CR) и перевода строки (LF), используемых вместе для обозначения новой строки в текстовых файлах на компьютерах под управлением Windows. В Unix и macOS для этой же цели используется только LF. Эти символы – невидимые строители структуры наших документов, писем и кода.
История и различия между CR и LF
Различие между CR и LF уходит корнями в эпоху телетайпов, когда CR перемещал каретку в начало строки, а LF – на строку вниз. Сегодня эти символы определяют, как текст отображается в различных системах и программах. Важно понимать эти различия, чтобы избежать проблем при переносе текстовых файлов между разными операционными системами.
Уязвимости, связанные с CRLF
CRLF инъекция и HTTP Response Splitting – это техники атак, при которых злоумышленники вставляют символы CRLF в веб-приложение, чтобы манипулировать HTTP-ответами. Это может привести к раскрытию конфиденциальной информации, выполнению вредоносного кода или подделке логов. Понимание этих уязвимостей критически важно для разработчиков и администраторов веб-сайтов.
Защита от CRLF-инъекций
Предотвращение CRLF-инъекций требует строгого контроля над тем, что может быть введено в систему. Использование функций кодирования специальных символов, проверка и очистка пользовательского ввода – ключевые методы защиты. Разработчики должны быть осведомлены о том, как данные обрабатываются и передаются в их приложениях, чтобы предотвратить возможность таких атак.
Проблемы с окончаниями строк и их решения
Проблемы с окончаниями строк возникают, когда текстовые файлы перемещаются между системами с различными стандартами окончаний строк. Это может привести к неправильному отображению текста или даже к сбоям в работе программ. Инструменты, такие как ‘dos2unix’ и ‘unix2dos’, а также функции в текстовых редакторах и средах разработки, позволяют конвертировать файлы в нужный формат, облегчая совместную работу и обмен данными.
Конвертация LF в CRLF и наоборот в программировании часто используется для обеспечения совместимости и правильного отображения текста в различных средах. Регулярные выражения и специальные настройки в средах разработки могут автоматизировать этот процесс, делая работу разработчиков более эффективной.
В заключение, понимание CRLF, его роли в программировании и веб-разработке, а также способов защиты от связанных с ним уязвимостей, является важным аспектом современной информационной безопасности. Осведомленность о проблемах с окончаниями строк и знание инструментов для их решения помогает обеспечить бесперебойную работу приложений и безопасность данных.
Если разработчик работает за одной разновидностью операционной системы, то он вряд ли столкнется с проблемой описанной ниже. Но как только ему приходится разрабатывать на разных операционных системах (Windows, Linux, MacOs) — вот тут могут появиться вопросы. Вопросы по поводу переносов строк в разных операционных системах.
В этой статье я отвечу на вопросы: Что такое переносы строк? Какими последовательностями символов они обозначаются, и наверное самый главный вопрос, почему с ними такая путаница?
Если совсем кратко, то при использовании любого текстового редактора, набирая в нем текст, вы делаете переносы строк. Чаще всего, эти переносы строк никак не отображаются в браузере. Для обычного пользователя, это просто перенос строки и все. Но ведь для машины любой текст это просто набор нулей и единиц. Как же тогда редактору понять где нужно сделать переносы строк, отображая очередной текст в текстовом редакторе? Правильно, нужно использовать специальную последовательность нулей и единиц, которые подскажут редактору, где нужно делать переносы. То есть нажимая клавишу Enter, вы не просто делаете перенос строки, а вставляете в ваш текст специальный символ переноса строки. Обычно в редакторах такие символы не отображаются, но их конечно же можно сделать видимыми (Чуть позже я покажу, как можно включить отображение скрытых символов в разных редакторах).
Отображаемые переносы строк в редакторе VS Code
И вот в чем путаница. Исторически сложилось так, что для переноса строчек, в разных операционных системах использовались разные последовательности символов. То есть если вы написали файл в одно операционной системе, и в ней у вас отлично работают переносы строк, то может быть так, что на другой OS все склеится в одну большую строчку, так как в этой операционной системе переносы строка задаются иначе.
Честно говоря, эту проблему сложно заметить, так как различные OS научились определять форматы переносов строк и адаптируют свои программы таким образом, чтобы переносы строк отображались правильно. Но это не исключает того фактора, что внутри самого текстового файла хранятся разные последовательности символов для переноса строк. Если вы разработчик, рано или поздно вы с этим столкнетесь.
Итак, давайте разбираться.
Новая строка
Новая строка (часто называется (line ending), концом строки (end of line или EOL), следующей строкой (next line или NEL) или разрывом строки (next line)) — это специальный управляющий символ или последовательность управляющих символов в спецификациях кодировки символов, таких как ASCII, EBCDIC, Unicode и других. Много названий, но суть одна. Этот символ или последовательность символов, используется для обозначения конца строки текста и начала новой.
Таких специальных последовательностей символов наберется с десяток. На разных старых компьютерах могут использоваться совсем специфические символы для переноса строк. Но, нас это уже мало интересует. Самые распространенные из низ это последовательности LF и CRLF.
Выбор переноса строк в редакторе VS Code
LF (0A в HEX) — расшифровывается как Line Feed или Подача Линии (нет, не кормящая линия)
CR (0D в HEX) — расшифровывается как Caret Return или возврат каретки.
Операционные системы Linux, MacOS для обозначения переноса строк используют последовательность LF.
OS Windows использует две последовательности одна за другой — CR LF.
Почему так? Будем разбираться дальше. Но перед тем как мы продолжим, обязательно посмотрите видео ниже.
Что такое Каретка, LF и CR
Отлично, теперь мы знаем откуда все пошло. Наш мигающий символ места ввода называется Каретка, а когда мы нажимаем Enter, создаем перенос строки, то есть возвращаем каретку на новую строчку.
Итого:
LF (line feed) — это виртуальная подача бумаги на одну линию.
CR (caret return) — это виртуальный сдвиг каретки, что бы мы могли начать печатать с новой строки.
Ок, но для чего все это? С печатной машинкой все понятно. Не сдвинешь каретку, не сможешь больше печатать, не подашь бумагу, будешь печатать поверх старого. То есть нужно 2 действия, но зачем это все в редакторе. Ведь в цифровом документе невозможно напечатать текст поверх предыдущего. Зачем этот сдвиг или подача бумаги? Все очень хитро.
Телетайпы
Перед тем как я затрону историю появления последовательностей переноса строк, хочу познакомить вас с телетайпами, иначе дальше можно не уловить смысл.
Телетайп (англ. teletype, TTY) — электромеханическая печатная машина, используемая для передачи между двумя абонентами текстовых сообщений по простейшему электрическому каналу (обычно по паре проводов).
Телетайп времён Второй мировой войны
Посмотрите видео ниже, чтобы лучше представлять как они работают.
Обратите внимание, что данные уже передаются в цифровом виде, но вот подача бумаги и перевод каретки все еще физические действия которые занимают довольно много времен.
История переноса строк
В середине 1800-х годов, задолго до появления телетайпов, операторы азбуки Морзе и телеграфисты изобрели и использовали символы азбуки Морзе для кодирования и форматирования текста с пробелами в текстовых сообщениях. В частности, в азбуке Морзе для обозначения новой строки.
Позже, в эпоху современных телетайпов, были разработаны стандартизированные управляющие коды набора символов, помогающие форматировать текст с пробелами. Кодировка ASCII была разработана одновременно Международной организацией по стандартизации (ISO) и Американской ассоциацией стандартов (ASA), последняя была организацией предшественницей Американского национального института стандартов (ANSI). В период с 1963 по 1968 год проекты стандартов ISO поддерживали использование только CR+LF или LF в качестве новой строки, в то время как проекты ASA поддерживали только CR+LF.
То есть уже в те годы, один стандарт предписывал использовать сразу две последовательности символов для переноса строки (CR+LF), а другой позволял указывать только одну (LF).
Последовательность CR + LF использовалась во многих ранних компьютерных системах, в которых использовались телетайпы — например для Teletype Model 33 ASR. Разделение новой строки на две последовательности скрывало тот факт, что печатающая головка не могла вовремя вернуться из крайнего правого положения в начало следующей строки для печати следующего символа. Любой символ, напечатанный после CR, часто печатался в виде пятна в середине страницы, в то время как печатающая головка все еще перемещала каретку обратно в первое положение. Вот что об этом писал Qualline, Steve (Автор книги по текстовому редактору VIM) «Решение состояло в том, чтобы сделать новую строку двумя символами: CR, чтобы переместить каретку в первый столбец, и LF, чтобы переместить бумагу вверх». На самом же деле, и этого было мало. Часто приходилось отправлять лишние символы — посторонние CR или NUL, — которые игнорируются телетайпом, но дают печатающей головке время для перемещения к левому полю. Многим ранним видеодисплеям также требовалось несколько символов для прокрутки дисплея.
То есть по факту, двойные последовательности для переноса строк это всего лишь «костыль» который нужен был для того, чтобы все печаталось корректно. На телетайпе, можно было выполнить физическую подачу бумаги и перенос каретки одной последовательностью управляющих символов (LF), но это приводило к тому, что печать следующей строчки начиналась еще до того, как каретка доедет до начала строки. Эту проблему решили, не исправлением телетайпов, а просто программным путем, делая задержки для телетайпа.
Приложения/редакторы должны были напрямую общаться с машиной Teletype и следовать ее соглашениям, поскольку концепция драйверов устройств, скрывающих такие детали оборудования от приложения, еще не была хорошо разработана. Поэтому текст обычно составлялся для удовлетворения потребностей телетайпов. Это соглашение использовалось в большинстве миникомпьютерных систем от DEC. CP/M (Control Program for Microcomputers — операционная система для массового рынка, созданная в 1974 году для процессоров Intel 8080/85) также использовала его для печати на тех же терминалах, что и мини-компьютеры. Оттуда MS-DOS (1981 г.) приняла CR + LF для совместимости между операционными системами, и это соглашение было унаследовано более поздней операционной системой Microsoft Windows.
Операционная система Multics начала разрабатываться в 1964 году и использовала только LF в качестве новой строки. Multics использовала драйвер устройства для преобразования этого символа в любую последовательность, необходимую принтеру (включая дополнительные символы заполнения), а один байт был более удобен для программирования. То, что кажется более очевидным выбором было — не использовать CR, поскольку CR предоставлял полезную функцию наложения одной строки на другую для создания эффектов полужирного шрифта, подчеркивания и зачеркивания. Возможно, что более важно, использование только LF в качестве разделителя строки уже было включено в проекты возможного стандарта ISO/IEC 646. Unix последовала практике Multics, а более поздние Unix-подобные системы последовали за Unix. Это создавало конфликты между Windows и Unix-подобными операционными системами, из-за чего файлы, созданные в одной операционной системе, не могли быть правильно отформатированы или интерпретированы другой операционной системой.
Понятия возврата каретки (CR) и перевода строки (LF) тесно связаны между собой и могут рассматриваться как по отдельности, так и вместе. В физических носителях пишущих машинок и принтеров две оси движения, «вниз» и «поперек», необходимы для создания новой строки на странице. Хотя конструкция машины (пишущей машинки или принтера) должна учитывать их по отдельности, абстрактная логика программного обеспечения может объединить их вместе как одно событие. Вот почему новая строка в кодировке символов может быть определена как CR и LF, объединенные в одну (обычно называемую CR+LF или CRLF).
Заключение
Мы разобрались в истории и теперь знаем откуда такая путаница с переносами строк. По сути — все из-за бага с телетайпами и костыля в виде символа перевода каретки который помог решить эту проблему. Вывод который я могу сделать из этой истории: Пишите код сразу правильно, иначе костыль сделанный на время останется с вами навсегда. В следующей статье я опиши способы автоматической замены и приведения символов переносов строк к одному варианту. Буду рад если оставите комментарий.
На десерт
Ну, и на десерт, видео от автора про пишущую машинку, о том как работает клавиша shift на печатных машинках.
© 2021 — 2025. Cyber Media. Информация сайта защищена законом об авторских правах. Кибер медиа.
Кибербезопасность, новости ИБ/ИТ и цифровая безопасность онлайн.
Разрешается частичное использование материалов на других сайтах при наличии ссылки на источник. Использование материалов сайта с полной копией оригинала допускается только с письменного разрешения редакции сайта.
Разрешается цитирование материалов Cyber Media (КиберМедиа) на других сайтах при наличии ссылки на источник. Использование какого-либо материала допускается только по согласованию с редакцией портала. Мы не гарантируем точность, полноту и полезность любого материала. Мнение авторов материалов может не совпадать с позицией редакции портала. Пользователи и иные заинтересованные лица в случае выявления нарушения интеллектуальных прав и иных противоправных действий других пользователей, обязуются прежде всего сообщить редакции портала о подобных нарушениях по электронной почте.
Политика обработки персональных данных
Согласие на обработку персональных данных