Windows перенос строки символ

Почему важно всегда ставить символ переноса строки в конце текстовых файлов?

Иногда при просмотре диффов коммитов через git log или git diff можно заметить следующий вывод:

Или на GitHub в интерфейсе для просмотра диффов:

Почему это так важно, что Git и GitHub предупреждают нас об этом? Давайте разберемся.

Что такое символ переноса строки?

Что может быть проще, чем текстовый файл? Просто текстовые данные — как хранятся на диске, так и отображаются. На самом деле правительство нам врёт всё немного сложнее.

Оффтопик про управляющие символы ASCII

Не все символы, которые содержатся в текстовых файлах, имеют визуальное представление. Такие символы ещё называют «управляющими», и к ним относятся, например:

  • нулевой символ ( x00 , \0 ) — часто используется для кодирования конца строки в памяти; т.е. программа считывает символы из памяти по одному до тех пор, пока не встретит нулевой символ, и тогда строка считается завершённой;
  • табуляция ( \x09 , \t ) — используется для выравнивания данных по границе столбца, так что это выглядит как таблица;
  • перевод строки ( \x0a , \n ) — используется для разделения текстовых данных на отдельные строки;
  • возврат каретки ( \x0d , \r ) — переместить курсор в начало строки;
  • возврат на один символ ( \x08 , \b ) — переместить курсор на один символ назад;
  • звонок ( \x07 , \a ) — если набрать этот символ в терминале, то будет бибикающий символ; именно так консольные программы, типа vim , бибикают на пользователей;
  • и другие.

Многие эти символы пришли к нам из эпохи печатных машинок, поэтому у них такие странные названия. И действительно, в контексте печатной машинки или принтера такие операции, как перевод строки (сместить лист бумаги вверх так, чтобы печатающая головка попала на следующую строку), возврат каретки (переместить печатающую головку в крайнее левое положение) и возврат на один символ назад, обретают смысл. При помощи возврата на один символ назад создавались жирные символы (печатаешь символ, возвращаешься назад и печатаешь его ещё раз) и буквы с диакритическими знаками, такие как à или ã (печатаешь символ, возвращаешься назад и печатаешь апостроф или тильду). Но зачем печатной машинке бибикалка?

Сегодня многие из этих символов потеряли смысл, но некоторые до сих пор выполняют функцию, схожую с исходной.

Текстовые редакторы отображают текстовые файлы в некоем адаптированном виде, преобразуя непечатаемые символы, например, переносы строк и табуляции преобразуются в настоящие отдельные строки или выравнивающие отступы.

Для набора символа переноса строки достаточно нажать клавишу «Enter», но на разных платформах этот символ закодируется по-разному:

  • в Unix-совместимых системах (включая современные версии macOS) используется один символ перевода строки ( LF );
  • в Windows используется сразу два символа — возврат каретки ( CR ) и перевод строки ( LF );
  • в очень старых версиях Mac OS (до 2001 года) использовался один символ CR .

Как видите, Windows точнее всего эмулирует поведение печатной машинки.

В языках программирования символ новой строки часто кодируют при помощи бэкслэш-последовательностей, таких как \n или \r\n . Нужно понимать разницу между такой последовательностью и настоящим символом переноса строки. Если в редакторе в файле *.txt просто набрать \n и сохранить, то вы получите ровно то, что написали. Символом переноса строки оно не станет. Нужно что-то, что заменит эти бэкслэш-последовательности на настоящие символы переноса строки (например, компилятор или интерпретатор языка программирования).

Почему перенос строки в конце файла важен?

Согласно определению из стандарта POSIX, который тоже пришёл к нам из эпохи печатных машинок:

Строка — это последовательность из нуля или более символов, не являющихся символом новой строки, и терминирующего символа новой строки.

Почему важен этот стандарт? Возможен миллиард способов реализовать одно и то же, и только благодаря стандартам, таким как POSIX, мы имеем сейчас огромное количество качественного ПО, которое не конфликтует друг с другом.

Читайте также:  Linux install pidgin otr

Т.е. если вы не ставите символ переноса строки в конце строки, то формально по стандарту такая строка не является валидной. Множество утилит из Unix, которыми я пользуюсь каждый день, написано в согласии с этим стандартом, и они просто не могут правильно обрабатывать такие «сломанные» строки.

Давайте, например, через Python создадим такой файл со сломанными строками:

Сколько по-вашему в этом файле строк? Три? Давайте посмотрим, что об этом файле думает утилита wc , которая с флагом -l умеет считать количество строк в файле:

Упс! wc нашла только 2 строки!

Давайте создадим еще один файл:

И попробуем теперь склеить два созданных файла при помощи утилиты cat :

Название cat — это сокращение от «конкатенация», и никак не связано с котиками. А жаль.

И опять какой-то странный результат! В большинстве случаев это не то, чего вы бы ожидали, но вполне возможны ситуации, когда вам нужен именно такой результат. Именно поэтому утилита cat не может самостоятельно вставлять отсутствующие символы переноса строки, иначе это сделало бы её поведение неконсистентным.

Это только пара примеров, но многие другие утилиты, которые работают с текстом (например, diff , grep , sed ), имеют такие же проблемы. Собственно говоря, это даже не проблемы, а их задокументированное поведение.

Ещё доводы:

  • при дозаписи содержимого в конец файла без переноса строки получится некрасивый дифф — будет изменена последняя строка (хотя на ней всего лишь добавился символ переноса);
  • файл с переносом строки и без переноса строки — это два разных файла; для diff и git diff единственный способ отобразить разницу между ними — это напечатать сообщение об отсутствии символа переноса строки;
  • согласно стандарту языка C (до 2014 года), непустые файлы с исходным кодом должны заканчиваться символом переноса строки.

Настраиваем редактор

Самый простой способ перестать думать о пустых строках и начать жить — это настроить свой текстовый редактор или IDE на автоматическое добавление символа переноса строки в конец файлов:

  • PyCharm и другие IDE JetBrains: Settings > Editor > General > Ensure an empty line at the end of a file on Save ;
  • VS Code: «files.insertFinalNewline»: true .

Для других редакторов смотрите настройку здесь.

Кстати, если вы пользуетесь форматтером black , то у меня хорошие новости — он всегда добавляет перенос строки в конец всех файлов *.py .

Заключение

Возможно, такая маленькая деталь, как перенос строки в конце файла и не кажется очень важной, а тема вообще кажется спорной, но боюсь, что у нас нет другого выбора, кроме как принять это правило за данность и просто выработать привычку (или настроить инструментарий) всегда ставить символ новой строки в любых текстовых файлах, даже если этого не требуется явно. Это считается распространённой хорошей практикой, и как минимум убережёт вас и ваших коллег от всяких неожиданных эффектов при работе с утилитами Unix.

В текстовом редакторе это выглядит как лишняя пустая строка в конце файла:

Перенос строки

Новая строка или перевод строки или перенос строки или разделитель строк или символ конца строки (EOL) в информатике — специальный управляющий символ (или их последовательность), служащий для завершения или разделения строк в текстовых данных.

Содержание

Общие сведения

Название закрепилось из-за того, что следующий символ после разделителя печатается уже на новой строке, то есть на следующей строке, расположенной ниже текущего текста, сразу следующей за разделителем. В виде символов представляют «новую строку» по-разному, в зависимости от аппаратной платформы и операционной системы, что может стать потенциально проблемой при обмене данными между системами с различными представлениями форматирования текста.

Следует различать ситуации, когда «новая строка» завершает строки, а когда — разделяет их. Если «новая строка» подразумевает отделение строк, то знак «новой строки» не ставится после последней строки файла. По общему соглашению, в большинстве систем «новая строка» добавляется даже после последней строки, т.е. трактуют «новую строку» как окончание строки. Некоторые программы имеют трудности с обработкой последней строки файла, если он не заканчивается символом новой строки. И наоборот, программы, ожидающие «новую строку» чтобы использовать ее как разделитель, интерпретируют последнюю «новую строку» как начало новой (пустой) строки. Это может привести к различиям в подсчете строк в файле, но во всем остальном это, в общем-то, безвредно.

Читайте также:  Устройство операционных систем linux

В текстах, предназначенных для чтения людьми при помощи программ, использующих переносы слов, символ «новой строки» обычно необходим, только если перенос строки должен быть независим от положения следующего слова на этой же строке, как, например, между параграфами и вертикальными списками (см. жёсткий возврат и мягкий возврат)

Терминология

Но́вая строка́ (калька с англ. new line зд. «с новой строки») — понятие логического форматирования текста в текстовом процессоре, браузере и т.д. Как правило (хотя и не обязательно), новая строка начинает запись текста с нового абзаца (англ. hard return ). Новая строка подразумевает обязательный перевод строки в соответственном месте текста, хотя «переводы строки» вообще имеются и внутри абзаца.

Возвра́т каре́тки (англ. Carriage Return, CR ) — управляющий символ 0x0D, при выводе которого курсор перемещается к левому краю поля, не меняя высоту. Этот управляющий символ вводится клавишей «Enter». Будучи записан в файле, в отдельности рассматривается как перевод строки только в системах Macintosh.

Пода́ча строки́ (от англ. Line Feed, LF «подача [бумаги] на строку») — управляющий символ ASCII 0x0A, при выводе которого «курсор» перемещается на следующую строку.

В случае принтера это означает сдвиг бумаги вверх, в случае дисплея — сдвиг курсора вниз если ещё осталось место, и прокрутку текста вверх если курсор находится на нижней строке.

Возвращается ли при этом курсор к левому краю или нет, зависит от реализации.

Таким образом, вывод последовательности CR LF в семантике терминала гарантирует действие «создание новой строки».

Терминалы (и их эмуляторы) могут также проводить различные преобразования символов (например, «LF» → «CR LF», «CR» → «CR LF») при вводе и выводе текста.

Представления и реализации

Программные приложения и операционые системы обычно представляют «новую строку» в виде одного или двух управляющих символов.

Краткие сведения

Системы, основанные на LF (от англ. Line feed (перевод строки), 0x0A) или CR (от англ. Carriage Return, 0x0D) по отдельности, или CR следует за LF (CR+LF, 0x0D 0x0A); см. ниже историческую причину для соглашения CR+LF. Эти символы основаны на командах принтера: перевод строки означает, что одна строка на бумаге должна быть перенесена при печати, а возврат каретки означает, что каретка печатающего устройства должна вернуться к началу текущей строки.

Основные цифровые реализации

  • LF (ASCII 0x0A) — используется в Unix и Unix-подобных операционнах системах (Linux, Xenix, Mac OS X, BeOS,
    • CR (ASCII 0x0D) — используется в машинах Commodore, Apple II, Mac OS до версии 9 и — используется в DEC CP/M, MP/M, OS/2, Microsoft Windows, Symbian OS, протоколах internet.

    Перевод строки в Unicode

    По стандарту, любое совместимое с Уникодом приложение должно воспринимать как перевод строки каждый из нижеследующих символов:

    • LF: подача строки, U+000A
    • CR: возврат каретки, U+000D
    • NEL: новая строка, U+0085
    • FF: новая страница, U+000C
    • LS: разделитель строк, U+2028
    • PS: разделитель абзацев, U+2029

    Последовательность CR LF (U+000D U+000A) надлежит воспринимать как один перевод строки (а не два) [1] .

    Трудности

    • Юникод старается примирить разницу представлений перевода строки, уравнивая CR, LF и CR LF, однако вступает в противоречие с наследуемым ASCII при трактовке LF CR, не предварённых CR: согласно ASCII это один перевод строки, а согласно Юникоду — два. Вероятно, Юникод сделал ставку на не существовавшие в ASCII разделители строк и абзацев, но они не прижились.
    • В зависимости от того, считать ли перевод строки её частью (завершителем) или не считать (считая их разделителем), после последней строки его ставят или нет. При пренебрежении одной из этих возможностей во время декодирования конец текста может стать неожиданным или появится лишняя пустая строка. Для сравнения, точка с запятой в Си команды завершает, а в Паскале разделяет.

    История

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

    На АЦПУ функции возврата каретки (головки) и подачи новой строки были разделены, откуда традиция представления перевода строки как CR LF перешла и к текстовым файлам.

    Некоторые исторические цифровые системы записи текста (например, при помощи перфокарт) вообще не использовали символ перевода строки.

    Примечания

    Дополнительные источники

    • The Unicode reference, see paragraph 5.8 in Chapter 5 of the Unicode 4.0 standard (PDF)
    • «The End-of-Line Story»
    • The [NEL] Newline Character
    • The End of Line Puzzle
    • Tofrodos — software for Unix that converts to and from DOS newlines
    • ToFroWin: a Windows shell extension that is able to convert multiple files from DOS to UN*X (and vice-versa) line endings right from the context menu.

    Wikimedia Foundation . 2010 .

    Смотреть что такое «Перенос строки» в других словарях:

    перенос строки — Перенос части длинной строки текста на следующую строку. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN line folding … Справочник технического переводчика

    ПЕРЕНОС СЛОВА — (wordwrap) Способность большинства текстовых редакторов (wordprocessors) автоматически переносить слово из конца строки на следующую строку, если это слово уже выходит за границу предельной длины строки. Бизнес. Толковый словарь. М.: ИНФРА М ,… … Словарь бизнес-терминов

    Перенос в математических формулах — разбивка не умещающейся в строку мат. формулы на части по строкам. Разделять формулы на части по строкам надо в первую очередь на знаках отношения между левой и правой частями формул (=, ≈, , ≤, ≥): во вторую на отточии, знаках сложения … Издательский словарь-справочник

    Перенос в химических формулах — разбивка не умещающейся в строку хим. формулы на части по строкам. Допускается только в случае крайней необходимости. Разбивку рекомендуется делать на знаках направления реакции (стрелках), знаках равенства, равновесия , взаимодействия (+ или –) … Издательский словарь-справочник

    ПЕРЕНОС — (анжанбеман) (французское enjambement, буквально перешагивание), крайний случай несовпадения членения на стихи (т.е. стихотворные строки) с естественным синтаксическим членением речи, когда синтаксическая пауза внутри стиха (или полустишия)… … Современная энциклопедия

    Перенос — (анжанбеман) (французское enjambement, буквально перешагивание), крайний случай несовпадения членения на стихи (т.е. стихотворные строки) с естественным синтаксическим членением речи, когда синтаксическая пауза внутри стиха (или полустишия)… … Иллюстрированный энциклопедический словарь

    Перенос (типографика) — У этого термина существуют и другие значения, см. перенос. Перенос в типографике разрыв части текста (слова, формулы и т. п.), при котором её начало оказывается на одной строке, а конец на другой. Содержание 1 Перенос слов 1 … Википедия

    перенос — ПЕРЕНО´С (франц. enjambement, от enjamber перешагнуть, перескочить) несовпадение интонационно фразового членения в стихе с метрическим членением, причем фраза (или часть ее, составляющая цельное синтаксическое сочетание), начатая в одном стихе,… … Поэтический словарь

    Перенос слова — Перенос в типографике разрыв части текста (слова, формулы и т. п.), при котором её начало оказывается на одной строке, а конец на другой. Содержание 1 Перенос слов 1.1 Знаки переноса 1.2 Осложненный перенос … Википедия

    перенос — (<<>>фр. enjambement перенос) перенос части фразы из предшествующей стихотворной строки в последующую, вызванный несовпадением традиционно заканчивающей строку конечной стиховой паузы с паузой смысловой. На фоне ритмически правильных стихов П.… … Словарь литературоведческих терминов

    Читайте также:  32 битный инструмент для установки windows 10
Оцените статью