Является ли обратная косая черта n `n` действительно переводом строки, но обрабатывается как новая строка?

#ascii #newline #carriage-return #linefeed

#ascii #новая строка #возврат каретки #перевод строки

Вопрос:

За все годы использования C, Ruby, Perl, Java и PHP или многих других языков я просто n подразумевал новую строку. Получается, что это всего лишь «Перевод строки», но обрабатывается как «Новая строка»?

Похоже, что ниже приведены некоторые факты, некоторые из них из статьи в Википедии:

  1. n это перевод строки, а не перевод строки, но почти все системы рассматривают его как «новую строку».
  2. Теоретически, rn это действительно то, что такое новая строка, потому что она перемещает курсор обратно в первую позицию по горизонтали и перемещает курсор вниз на одну строку. Однако, хотя некоторые системы используют это как новую строку (Windows), некоторые системы просто обрабатывают один n как означающий новую строку (Unix, Linux, Mac).
  3. Были некоторые системы, в которых на самом деле был символ новой строки, например, на мэйнфреймах IBM и ZX80, но он так и не стал символом в ASCII, и мы его почти никогда не используем.
  4. Итак, в ASCII у нас действительно все еще есть только возврат каретки r , который равен 0x0d (десятичный 13), и перевод строки n , который равен 0x0a (десятичный 10).
  5. И что касается программирования, вывод 0x0a символа должен быть новой строкой, хотя на самом деле это всего лишь перевод строки.
  6. Теоретически, если мы выводим 0x0a , можно утверждать, что следующий вывод будет продолжаться в том же горизонтальном положении, что и предыдущая строка, а не в крайнем левом положении, но на практике это не так. В большинстве систем это всегда крайняя левая позиция.
  7. r Какая-то программа все еще используется для вывода информации в той же строке, а не для прокрутки вверх. Это работает, хотя мы никогда не знаем, сколько «пробелов» нужно распечатать, чтобы скрыть старую информацию. Это может быть сделано с помощью escape-последовательности ANSI 33[K для очистки от курсора до конца строки или, что более правильно, с использованием некоторой библиотеки curses, которая работает на этой конкретной платформе.

Я думаю, что две основные точки удаления

  1. У нас действительно нет символа новой строки, но мы принимаем n , что перевод строки означает перевод строки, и большинство систем просто обрабатывают этот перевод строки как «средний» перевод строки.
  2. Это действительно 0x0a так, просто чтобы прояснить ситуацию. Я много лет думал, что это 0x0d так, но это не так.

Являются ли приведенные выше точными или какие-либо исправления или дополнения?

Комментарии:

1. В конце концов, это всего лишь байт, и то, как системы интерпретируют его, зависит от них. Это не «на самом деле» одно или другое.

2. ну, причина была в том, что однажды меня допросили на собеседовании (в Google), что такое перевод строки, что такое новая строка, что такое возврат каретки и что такое n и r … лучше всего расставить все точки над i

3. Из того, что я всегда понимал, «новая строка» — это визуальное проявление, чаще всего основанное только на CRLF или LF и CR. Интерпретация управляющих символов будет варьироваться в зависимости от ОС и других реализаций.

Ответ №1:

В настоящее время существуют следующие окончания строк («новые строки»):

  • Old MacOS 0x0D = 13 = CR = r = возврат каретки
  • Linux 0x0A = 10 = LF = n = перевод строки
  • AS400 0x85 = EBCDIC NL = NEL
  • Windows 0x0D 0x0A = CR-LF = rn

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

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

Для сопоставления с шаблоном существует регулярное выражение R (Java "\R" ) для сопоставления с любой последовательностью перевода строки.

Комментарии:

1. Я попробовал распечатать n на Ruby на Mac, и он выдал один 0x0a … Я думаю, вероятно, то же самое, если это C или Java на Mac. В Windows это, вероятно 0x0d 0x0a , все еще выдает…

2. @неполярность в java r,n,rn исправлена u000d,u000a,u000du000a . На других языках n может быть переосмыслено в Windows 0x0d 0x0a , как вы сказали. Что является показателем переносимости C, поскольку многие программы на C (Unix) предшествовали Windows. Mac OS в настоящее время является частью семейства Unix с его n ,

Ответ №2:

Новая строка — это абстрактное имя для завершения строки текстового файла. На компьютерах Win она реализована как 0x0d0a. На машинах Unix это реализовано как 0x0a. На старых компьютерах Mac она реализована как 0x0d.

Все эти значения реализации являются символами ASCII. Они унаследованы от телетайпов. 0x0d фактически заставил каретку переместиться, поэтому следующий напечатанный символ находится в столбце 1. 0x0a фактически заставил каретку повернуть одну строку.

Раньше я видел это на телетайпе Model 33 🙂

Еще одно место, где термины могут запутаться, — это символ ASCII NUL . Его значение равно 0x00. Иногда вы видите это в коде как ». Многие люди называют ее NULL, которая является значением указателя в C / C , значение которого обычно равно 0.

Комментарии:

1. поскольку Mac может быть начиная с 1984 года, когда упоминается старый Mac, это Mac до 1997, 1998 или совсем недавно, например, 2007?

2. У меня нет даты. Был момент, когда они фактически перешли на Unix. Когда это произошло 0x0d -> 0x0a.