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