Что за символ в тексте n

Перевод строки в тексте: \n, \r или \r\n

Это следует учитывать при составлении шаблонов регулярных выражений для соответствующих функции PHP и, чтобы парсинг производился правильно, можно использовать вместо них универсальную экранирующую последовательность «\R», которая соответствует любому из трёх, указанных выше, вариантов:

В коде выше, в последнем поиске соответствий, указан шаблон ‘=\R=’ , чтобы показать, что управляющий символ «\R» соответствует последовательности «\r\n» как одному символу.

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

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

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

GitHub "now newline at end of file" warning

Почему это так важно, что 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, мы имеем сейчас огромное количество качественного ПО, которое не конфликтует друг с другом.

Т.е. если вы не ставите символ переноса строки в конце строки, то формально по стандарту такая строка не является валидной. Множество утилит из 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.

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

Как перевести текст на новую строку в Python

Символ новой строки используется в Python, чтобы отмечать конец одной строки и начало новой. Важно понимать, как использовать его для вывода в консоль и работы с файлами.

В этом материале речь пойдет о следующем:

  • Как определять символ новой строки в Python.
  • Как использовать символ новой строки в строках и инструкциях вывода.
  • Вывод текста без добавления символа новой строки в конце.

Символ новой строки

Символ новой строки в Python выглядит так \n . Он состоит из двух символов:

  • Обратной косой черты.
  • Символа n (в нижнем регистре).

Если встретили этот символ в строке, то знайте, что он указывает на то, что текущая строка заканчивается здесь, а новая начинается сразу после нее.

Его же можно использовать в f-строках: print(f»Hello\nWorld!») .

Символ новой строки в print

По умолчанию инструкции вывода добавляют символ новой строки «за кулисами» в конце строки. Вот так:

Символ новой строки в print

Это поведение описано в документации Python. Значение параметра end встроенной функции print по умолчанию — \n . Именно таким образом символ новой строки добавляется в конце строки.

Вот определение функции:

Значением end=’\n’ , поэтому именно этот символ будет добавлен к строке.

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

Разница между '\ n' и '\ r \ n'

Да да, я знаю , что ‘\n’ пишет перевод строки в UNIX в то время как для Windows , существует последовательность два символа: ‘\r\n’ . Все это очень хорошо в теории, но мой вопрос почему ? Почему символ возврата каретки является дополнительным в Windows? Если UNIX может это сделать, \n почему для этого требуется Windows два символа?

Я читаю книгу Дэвида Бизли «Питон», и он говорит:

Например, в Windows при записи символа ‘\ n’ фактически выводится двухсимвольная последовательность ‘\ r \ n’ (а при чтении файла обратно, \ r \ n ‘преобразуется обратно в один’ \ n ‘ характер).

Почему дополнительные усилия?

Я буду честен Я давно знал разницу, но никогда не удосужился спросить, ПОЧЕМУ. Я надеюсь, что ответили сегодня.

Спасибо за ваше время.

Windows обратно совместима с MS-DOS (даже агрессивно), и MS-DOS использовала соглашение CR-LF, потому что MS-DOS была совместима с CP / M-80 (несколько случайно), который использовал соглашение CR-LF, потому что так вы управляли принтером (потому что принтеры изначально были пишущими машинками с компьютерным управлением).

У принтеров есть отдельная команда для перемещения бумаги на одну строку вверх на новую строку и отдельная команда для возврата каретки (там, где была установлена ​​бумага) обратно на левое поле.

Вот почему. И да, это досадно, но это часть пакета, который позволил MS-DOS победить CP / M, а Windows 95 — всем остальным графическим интерфейсам поверх DOS, а Windows XP — победить. из Windows 98.

(Примечание: современные лазерные принтеры все еще имеют эти команды, потому что они также обратно совместимы с более ранними принтерами — в частности, HP делает это хорошо)

Для тех, кто не знаком с пишущими машинками, вот видео, показывающее, как печатался текст: http://www.youtube.com/watch?v=LJvGiU_UyEQ . Обратите внимание, что сначала бумага перемещается вверх, а затем возвращается каретка, даже если это происходит простым движением. Дин уведомил машинистку, что конец близок, и готовиться к нему.

Насколько я знаю, это восходит к временам пишущих машинок.

\r это возврат каретки, который перемещается туда, где вы печатаете на странице обратно влево (или вправо, если это ваша культура)

\n это новая линия, которая перемещает вашу бумагу вверх по линии.

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

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

Я не знаю, является ли это общеизвестным, но следует отметить, что CR все еще понимается современными эмуляторами терминала:

Это удобно для индикаторов прогресса, например

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

Возврат каретки означал «вернуть бит, который вы вводите, в начало строки».

Windows использует CR + LF, потому что MS-DOS сделал, потому что CP / M сделал, потому что это имело смысл для последовательных линий.

Unix скопировал свое соглашение \ n, потому что это сделал Multics.

Я подозреваю, что если вы покопаетесь достаточно далеко назад, вы обнаружите политические разногласия между разработчиками!

(Вы пропустили дополнительный забавный бит, в котором используется соглашение Mac (или раньше) просто использовать CR для разделения строк. А теперь в Unicode также есть собственный разделитель строк, U + 2028!)

ASCII был разработан одновременно ISO и ASA, предшественницей ANSI. В период 1963–1968 гг. Проекты стандартов ИСО поддерживали использование только CR + LF или LF в качестве новой строки, в то время как проекты ASA поддерживали только CR + LF.

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

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

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

MS-DOS (1981) принял CR + LF CP / M; Использование CP / M CR + LF имело смысл для использования компьютерных терминалов через последовательные линии. Это соглашение было унаследовано более поздней операционной системой Microsoft Windows.

Операционная система Multics начала разработку в 1964 году и использовала только LF в качестве новой строки. Unix следовал практике Multics, а более поздние системы следовали Unix.

Что это за люди, спрашивающие: «Почему Unix может делать, \n а не Windows»? Это такой странный вопрос.

  1. ОС практически не имеет к этому никакого отношения. Это больше зависит от того, как приложения, библиотеки, протоколы и форматы файлов имеют дело с вещами. За исключением случаев, когда ОС читает / записывает текстовые команды конфигурации или команды командной строки, нет смысла винить ОС.
  2. Большинство приложений для Windows могут читать как хорошо, так \n и \r\n хорошо. Они также выводят, \r\n так что все счастливы. Программа не просто «делает» \n или \r\n — она принимает одно, другое или оба, и выводит одно, другое или оба.
  3. Как программист, это должно почти никогда не беспокоить вас. Практически на каждом языке / платформе есть возможность написать правильную конечную строку и читать наиболее надежно. Единственный раз, когда мне приходилось иметь дело с этой проблемой, было, когда я писал HTTP-сервер — и это было потому, что определенный браузер (подсказка: следующий по популярности браузер после IE) работал \n вместо правильного \r\n .
  4. Гораздо более актуальный вопрос: почему так много современных приложений Unix выводят только \n полностью, зная, что есть некоторые протоколы и программы, которым это не нравится?

Причина, по которой соглашения применяются в их различных системах (\ n в системах типа Unix, \ r \ n в Windows и т. Д.), Заключается в том, что, выбрав соглашение, вы НЕ МОЖЕТЕ изменить его, не сломав кучу файлов людей. И это вообще не одобряется.

Системы Unix-типа были разработаны (очень рано) с использованием различных моделей телетайпа, и в какой-то момент кто-то решил, что оборудование должно возвращаться, когда оно выполняло перевод строки.

Windows пришла из DOS, поэтому для Windows действительно возникает вопрос: почему DOS использовал эту последовательность cr / lf? Я предполагаю, что это как-то связано с CP / M, где DOS имеет некоторые корни. Опять же, конкретные модели телетайпа, возможно, сыграли свою роль.

Вот ответ из лучшего источника — Microsoft. Почему терминатор строки CR + LF?

Этот протокол восходит ко временам телетайпов. CR означает «возврат каретки» — управляющий символ CR возвращает печатающую головку («каретка») в столбец 0 без продвижения бумаги. LF означает «перевод строки» — символ управления 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. Если вы неправильно установили эту настройку, вы получите текст ступеньки, где

где предыдущая строка остановилась. Так что даже Unix, когда он оставлен в необработанном режиме, требует CR + LF для завершения строк. Неявный CR перед LF является изобретением unix, вероятно, в качестве экономии, поскольку он экономит один байт на строку.

Родословная Unix языка C перенесла это соглашение в стандарт языка C, который требует только «\ n» (который кодирует LF) для завершения строк, что накладывает бремя на библиотеки времени выполнения для преобразования необработанных файловых данных в логические строки.

Язык C также ввел термин «новая строка», чтобы выразить понятие «терминатор родовой строки». Мне сказали, что комитет ASCII изменил имя персонажа 0x0A на «новую строку» примерно в 1996 году, поэтому уровень путаницы был поднят еще выше.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *