Почему разрывы строк в Windows больше, чем разрывы строк в Unix?

Почему разрывы строк в Windows больше, чем разрывы строк в Unix?

Итак, я создал два файла, каждый из которых содержал 127 955 строк и 24 случайных символа в каждой строке. Что касается текста, то оба файла были полностью идентичны. Однако в одном файле были переносы строк Unix, а в другом — Windows. Файл с переносами строк Unix был размером 3 124 КБ, а файл с переносами строк Windows — 3 249 КБ. Других различий между файлами не было, поэтому я должен предположить, что по какой-то причине переносы строк Windows занимают больше места. Есть идеи, почему?

решение1

Если вы откроете текстовые файлы в шестнадцатеричном редакторе, то в конце строки вы увидите следующую разницу:

Окончания строк Windows:0x0D 0x0A

Окончания строк Unix:0x0A

0x0Dшестнадцатеричное значение возврата каретки (в текстовом виде представлено просто как \r).

— шестнадцатеричное значение 0x0Aсимвола новой строки (в тексте обозначается просто как \n).

Если строки заканчиваются в формате EOL Windows, то они будут заканчиваться двумя символами: \r\n; тогда как формат EOL Unix заканчивается одним символом: \n.

Итак, 127,955 * (24 + 1) == 3,198,875 bytes (3,123.9 KB)для Unix EOL и 127,955 * (24 + 2) == 3,326,830 bytes (3,248.86 KB)для Windows EOL.

Надеюсь, это поможет.

решение2

Что касается настоящего «почему» — исторически телетайп использовал возврат каретки (шестнадцатеричный код 0D) для перемещения печатающей головки к левому полю, а затем перевод строки (шестнадцатеричный код 0A) для продвижения бумаги.

Commodore, Atari и (до Unix) Apple сохранили возврат каретки в качестве символа конца строки; Unix сохранил перевод строки; а CP/M / DOS сохранили оба.

Многие интернет-протоколы (например, HTTP) по-прежнему определяются в терминах обоих символов (т. н. «CRLF»), но в реальных текстовых файлах единственная программа в Windows, с которой я столкнулся и которая некорректно обрабатывает «только» перевод строки, — это Блокнот.

Технически термин «Newline» существует только для того, чтобы скрыть это историческое различие. Например, в C «\n» или в Lisp «#\Newline» соответствует любой нотации, которую предпочитает локальная система, в отличие от «\r» или #\Return, когда требуется один конкретный байтовый символ.

решение3

Windows использует возврат каретки с последующим переводом строки. Unix использует только перевод строки. Так что это один дополнительный байт на каждый перенос строки.

Связанный контент