Введение

Специальные символы в вычислительной технике, обозначающие конец строки текста.

Перевод строки (часто называемый концом строки, EOL, NEL или разрывом строки) — это управляющий символ или последовательность управляющих символов в спецификациях кодирования символов, таких как ASCII, EBCDIC, Unicode и другие. Этот символ или последовательность символов используется для обозначения конца строки текста и начала новой строки.

История

В середине 1800-х годов, задолго до появления телепринтеров и телетайпов, операторы или телеграфисты, использовавшие код Морзе, изобрели и применяли просигналы кода Морзе для кодирования форматирования пробелов в формальных письменных текстовых сообщениях. В частности, просигнал Морзе (мнемоническое «reak ext»), представленный последовательностью буквальных текстовых символов кода Морзе «B» и «T», отправляемых без обычных межсимвольных пробелов, использовался в коде Морзе для кодирования и обозначения новой строки или нового раздела в формальном текстовом сообщении. Позже, в эпоху современных телепринтеров, были разработаны стандартизированные коды управления символами для облегчения форматирования текста с пробелами. ASCII был разработан одновременно Международной организацией по стандартизации (ISO) и Американской ассоциацией стандартов (ASA), последняя являлась предшественницей Американского национального института стандартов (ANSI). В период с 1963 по 1968 год проекты стандартов ISO поддерживали использование либо + , либо только в качестве символа новой строки, в то время как проекты ASA поддерживали только +. Последовательность + широко использовалась во многих ранних компьютерных системах, принявших телетайпы – как правило, телетайп модели 33 ASR – в качестве консольного устройства, поскольку эта последовательность требовалась для позиционирования этих принтеров в начале новой строки. Разделение символа новой строки на две функции скрывало тот факт, что печатающая головка не успевала вернуться с правого края к началу следующей строки, чтобы напечатать следующий символ. Любой символ, напечатанный после , часто отпечатывался размытым пятном в середине страницы, пока печатающая головка перемещала каретку обратно в начальное положение. «Решением было сделать символ новой строки двумя символами: для перемещения каретки в первый столбец и для перемещения бумаги вверх». Фактически, часто требовалось отправлять дополнительные заполняющие символы – возврат каретки (CR) или нулевые символы (NUL), которые игнорировались, но давали печатающей головке время переместиться к левому краю. Многие ранние видеодисплеи также требовали нескольких временных интервалов символов для прокрутки дисплея. На таких системах приложения должны были напрямую взаимодействовать с телетайпом и следовать его соглашениям, поскольку концепция драйверов устройств, скрывающих такие аппаратные детали от приложения, еще не была достаточно развита. Поэтому текст обычно создавался с учетом требований телетайпов. Большинство миникомпьютерных систем от DEC использовали это соглашение. CP/M также использовала его для печати на тех же терминалах, что и миникомпьютеры. Затем MS DOS (1981) переняла + от CP/M для обеспечения совместимости, и это соглашение было унаследовано более поздней операционной системой Microsoft Windows. Операционная система Multics начала разрабатываться в 1964 году и использовала в качестве символа новой строки. Multics использовала драйвер устройства для преобразования этого символа в любую последовательность, необходимую принтеру (включая дополнительные заполняющие символы), и один байт был более удобен для программирования. Более очевидный выбор – не был использован, поскольку предоставлял полезную функцию наложения одной строки на другую для создания эффектов полужирного шрифта, подчеркивания и зачеркивания. Возможно, что более важно, использование в качестве символа конца строки уже было включено в проекты будущего стандарта ISO/IEC 646. Unix следовала практике Multics, а затем и Unix-подобные системы. Это создавало конфликты между операционными системами Windows и Unix, когда файлы, созданные в одной операционной системе, не могли быть правильно отформатированы или интерпретированы другой операционной системой (например, скрипт оболочки UNIX, написанный в текстовом редакторе Windows, таком как Блокнот).

Представительство

Понятия возврата каретки (CR) и перевода строки (LF) тесно связаны и могут рассматриваться как отдельно, так и вместе. В физических устройствах, таких как пишущие машинки и принтеры, для создания новой строки на странице необходимы две оси движения: "вниз" и "вправо". Хотя при разработке устройства (пишущей машинки или принтера) они должны рассматриваться отдельно, абстрактная логика программного обеспечения может объединить их в одно событие. Поэтому новая строка в кодировке символов может быть определена как комбинация и , объединенных в один символ (обычно называемый или ). Некоторые наборы символов предоставляют отдельный код символа новой строки. Например, EBCDIC предоставляет код символа в дополнение к кодам и . Unicode, помимо кодов ASCII и контрольных кодов, также предоставляет контрольный код "следующая строка" (Next Line), а также контрольные коды для маркеров "разделитель строк" и "разделитель абзацев". +Представление новой строки в программных приложениях и операционных системах одним или двумя управляющими символами. Операционная система Кодировка символов Сокращение hex value dec value Escape sequence POSIX-ориентированные системы: Unix и Unix-подобные системы (Linux, macOS, *BSD, AIX, Xenix и т. д.), QNX 4+, Multics, BeOS, Amiga, RISC OS и другие ASCII Windows, MS DOS, Atari TOS, DEC TOPS 10, RT 11, CP/M, MP/M, OS/2, Symbian OS, Palm OS, Amstrad CPC и большинство других ранних не-Unix и не-IBM операционных систем Commodore 64, Commodore 128, Acorn BBC, ZX Spectrum, TRS 80, Apple II, Oberon, классическая Mac OS, HP Series 80, MIT Lisp Machine и OS 9 Acorn BBC и RISC OS, используют в качестве исходного текста QNX до POSIX (версия < 4) Atari 8-битные компьютеры ATASCII IBM основные системы, включая z/OS (OS/390) и IBM i (OS/400) EBCDIC ZX80 и ZX81 (домашние компьютеры от Sinclair Research Ltd) ZX80/ZX81 собственная кодировка

В системах EBCDIC — в основном в основных системах IBM, включая z/OS (OS/390) и IBM i (OS/400) — используется (New Line, ) как символ, объединяющий функции перевода строки и возврата каретки. Эквивалентный символ Unicode называется (Next Line). EBCDIC также имеет управляющие символы, называемые и , но числовое значение отличается от используемого в ASCII. Кроме того, некоторые варианты EBCDIC также используют , но присваивают символу другой числовой код. Однако эти операционные системы используют файловую систему, основанную на записях, которая хранит текстовые файлы в виде одной записи на строку. В большинстве форматов файлов фактические символы завершения строки не хранятся. Операционные системы для CDC 6000 серии определяли новую строку как два или более нулевых шестибитных символа в конце 60-битного слова. Некоторые конфигурации также определяли нулевой символ как символ двоеточия, в результате чего несколько двоеточий могли интерпретироваться как новая строка в зависимости от позиции. RSX 11 и OpenVMS также используют файловую систему, основанную на записях, которая хранит текстовые файлы в виде одной записи на строку. В большинстве форматов файлов фактические символы завершения строки не хранятся, но служба управления записями может прозрачно добавлять символ завершения к каждой строке при извлечении ее приложением. Сами записи могут содержать те же символы завершения строки, что может рассматриваться как полезная функция или недостаток в зависимости от приложения. RMS не только хранит записи, но и хранит метаданные о разделителях записей в разных битах файла, чтобы еще больше усложнить ситуацию (поскольку файлы могут иметь записи фиксированной длины, записи, которым предшествует счетчик, или записи, которые завершаются определенным символом). Биты не являются универсальными, поэтому, хотя они могут указывать, что или или даже является символом завершения строки, они не могут заменить какой-либо другой код. Фиксированная длина строки использовалась в некоторых ранних операционных системах мейнфреймов. В такой системе, например, предполагался неявный конец строки каждые 72 или 80 символов. Символ новой строки не хранился. Если файл импортировался из внешнего мира, строки короче длины строки должны были заполняться пробелами, а строки длиннее длины строки должны были обрезаться. Это имитировало использование перфокарт, на которых каждая строка хранилась на отдельной карте, обычно с 80 столбцами на каждой карте, часто с порядковыми номерами в столбцах 73–80. Многие из этих систем добавляли управляющий символ возврата каретки в начало следующей записи; это могло указывать, является ли следующая запись продолжением строки, начатой предыдущей записью, или новой строкой, или должна перезаписывать предыдущую строку (подобно ). Часто это был обычный печатный символ, такой как , который поэтому не мог использоваться в качестве первого символа в строке. Некоторые ранние линейные принтеры интерпретировали эти символы непосредственно в записях, отправляемых им.

Протоколы связи

Многие протоколы связи используют ту или иную конвенцию обозначения новой строки. В частности, протоколы, опубликованные рабочей группой по разработке интернет-стандартов (IETF), как правило, используют последовательность ASCII CRLF. В некоторых более старых протоколах за символом новой строки может следовать контрольная сумма или символ проверки чётности.

Проблемы с различными форматами новых строк

Различные соглашения о символах новой строки приводят к неправильному отображению текстовых файлов, переданных между системами разных типов. Текст в файлах, созданных в программах, распространенных в Unix или классической Mac OS, может отображаться как одна длинная строка в большинстве программ, распространенных в MS DOS и Microsoft Windows, поскольку они не распознают символ новой строки или символ возврата каретки как разрыв строки. И наоборот, при просмотре файла, созданного в Windows, на Unix-подобной системе, дополнительный символ новой строки может отображаться как двойной перенос строки, как , или как в конце каждой строки. Кроме того, программы, отличные от текстовых редакторов, могут не принимать файл, например, файл конфигурации, закодированный с использованием чужого соглашения о символах новой строки, как допустимый файл. Проблему бывает трудно обнаружить, поскольку некоторые программы корректно обрабатывают чужие символы новой строки, а другие — нет. Например, компилятор может завершиться с ошибками синтаксиса, даже если исходный файл выглядит правильно при отображении в консоли или редакторе. Современные текстовые редакторы обычно распознают все варианты символов новой строки и позволяют пользователям преобразовывать их между различными стандартами. Веб-браузеры обычно также способны отображать текстовые файлы и веб-сайты, использующие разные типы символов новой строки. Даже если программа поддерживает различные соглашения о символах новой строки, эти функции часто недостаточно четко обозначены, описаны или документированы. Обычно пользователям предоставляется меню или выпадающий список с перечислением различных соглашений о символах новой строки без указания, приведет ли выбор к переинтерпретации, временному преобразованию или постоянному преобразованию символов новой строки. Некоторые программы неявно преобразуют символы новой строки при открытии, копировании, вставке или сохранении — часто непоследовательно. Большинство текстовых интернет-протоколов (включая HTTP, SMTP, FTP, IRC и многие другие) требуют использования ASCII + (, ) на уровне протокола, но рекомендуют, чтобы приложения с высокой степенью устойчивости к ошибкам также распознавали одиночные символы новой строки (, ). Несмотря на установленный стандарт, многие приложения ошибочно используют escape-последовательность новой строки C вместо правильной комбинации escape-последовательности возврата каретки и escape-последовательности новой строки (+) (см. раздел «Newline в языках программирования» выше). Это случайное использование неправильных escape-последовательностей приводит к проблемам при попытке связи с системами, придерживающимися более строгой интерпретации стандартов, а не предлагаемой устойчивой к ошибкам интерпретации. Одной из таких нетерпимых систем является почтовый агент qmail, который активно отказывается принимать сообщения от систем, отправляющих одиночные символы новой строки вместо требуемых +. Стандартный формат интернет-сообщений для электронной почты гласит: «CR и LF ДОЛЖНЫ встречаться только вместе как CRLF; они НЕ ДОЛЖНЫ появляться независимо в теле сообщения». Различия в реализации SMTP в отношении обработки одиночных символов LF и/или CR привели к атакам спуфинга SMTP, известным как «SMTP smuggling». Протокол передачи файлов может автоматически преобразовывать символы новой строки в файлах, передаваемых между системами с разными представлениями символов новой строки, когда передача выполняется в «ASCII-режиме». Однако передача двоичных файлов в этом режиме обычно приводит к катастрофическим результатам: любое вхождение последовательности байтов новой строки, которая в данном контексте не имеет семантики завершения строки, а является просто частью обычной последовательности байтов, будет преобразовано в любое представление новой строки, используемое другой системой, что фактически повредит файл. FTP-клиенты часто используют некоторые эвристики (например, проверку расширений имен файлов) для автоматического выбора двоичного или ASCII-режима, но в конечном итоге пользователи должны убедиться, что их файлы передаются в правильном режиме. Если есть какие-либо сомнения относительно правильного режима, следует использовать двоичный режим, так как тогда файлы не будут изменены FTP, хотя они могут отображаться неправильно.

Интерпретация

Два способа интерпретации символов новой строки, оба логически непротиворечивые, заключаются в том, что они либо разделяют строки, либо завершают их. Если символ новой строки рассматривается как разделитель, то после последней строки файла не должно быть символа новой строки. Некоторые программы испытывают трудности при обработке последней строки файла, если она не завершается символом новой строки. С другой стороны, программы, ожидающие, что символ новой строки будет использоваться как разделитель, интерпретируют завершающий символ новой строки как начало новой (пустой) строки. Напротив, если символ новой строки считается признаком завершения строки, то все текстовые строки, включая последнюю, должны завершаться символом новой строки. Если последняя последовательность символов в текстовом файле не является символом новой строки, последняя строка файла может считаться некорректной или неполной, либо файл может считаться усеченным. В тексте, предназначенном в основном для чтения людьми с использованием программного обеспечения, реализующего автоматический перенос строк, символ новой строки обычно сохраняется только в том случае, если требуется разрыв строки независимо от того, поместится ли следующее слово на той же строке, например, между абзацами или в вертикальных списках. Поэтому в логике текстовых процессоров и большинства текстовых редакторов символ новой строки используется для обозначения конца абзаца и известен как "жесткий перенос строки", в отличие от "мягких переносов строк", которые динамически создаются для реализации переноса строк и могут изменяться при каждом отображении. Во многих приложениях существует отдельный управляющий символ, называемый "ручным переносом строки", для принудительного разрыва строки внутри одного абзаца. Графическое представление управляющего символа жесткого переноса строки обычно представляет собой пилькро (¶), а для ручного переноса строки – стрелку возврата каретки (↵).

Обратные и частичные каналы подачи

(U+008D REVERSE LINE FEED, ISO/IEC 6429 8D, десятичное число 141) используется для перемещения позиции печати на одну строку назад (путем обратной подачи бумаги или перемещения курсора дисплея вверх на одну строку), чтобы другие символы могли быть напечатаны поверх существующего текста. Это может быть сделано для выделения текста жирным шрифтом, добавления подчеркивания, зачеркивания или других символов, таких как диакритические знаки. Аналогично, (U+008B PARTIAL LINE FORWARD, десятичное число 139) и (U+008C PARTIAL LINE BACKWARD, десятичное число 140) могут использоваться для смещения позиции печати текста вперед или назад на часть вертикального интервала между строками (обычно, на половину). Их можно комбинировать для создания индексов (сначала смещая вперед, затем назад) и верхних индексов (сначала смещая назад, затем вперед), а также для печати диакритических знаков.