Поэтому я создал два файла, каждый из которых содержит 127 955 строк и 24 случайных символа в строке. Что касается текста, два файла были полностью идентичны. Однако один файл имел разрывы строк в Unix, а другой - разрывы строк в Windows. Файл с разрывами строк в Unix составлял 3124 КБ, а файл с разрывами строк в Windows - 3249 КБ. Других различий между файлами не было, поэтому я должен предположить, что по какой-то причине разрывы строк в Windows занимают больше места. Есть идеи почему?
3 ответа
Если вы откроете текстовые файлы в шестнадцатеричном редакторе, разница, которую вы увидите в конце строки, будет следующей:
Концы строк Windows: 0x0D 0x0A
Концы строк Unix: 0x0A
0x0D
- это шестнадцатеричное значение для возврата каретки (представлено в тексте просто как \r
).
0x0A
- это шестнадцатеричное значение для символа новой строки (представленное в тексте просто как \n
).
Когда окончания строк имеют формат Windows EOL, строки заканчиваются двумя символами: \r\n
; в то время как формат Unix EOL заканчивается 1 символом: \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.
Надеюсь, это поможет.
Windows использует возврат каретки с последующим переводом строки. Unix просто использует новую строку. Так что это один дополнительный байт на разрыв строки.
Что касается фактического бита "почему" - Исторически телетайп использовал возврат каретки (hex 0D), чтобы переместить печатающую головку к левому полю, а затем перевод строки (hex 0A) для продвижения бумаги.
Commodore, Atari и (до Unix) Apple сохранили символ возврата каретки в качестве символа окончания строки; Unix сохранил перевод строки; и CP/M / DOS сохранили оба.
Многие интернет-протоколы (например, HTTP) по-прежнему определяются в терминах обоих (иначе называемых "CRLF"), но в реальных текстовых файлах - единственной программе в Windows, с которой я столкнулся, которая неправильно обрабатывает "просто" строку Подача Блокнот.
Технически, термин "новая строка" существует только для того, чтобы скрыть эту историческую разницу. Например, в C a "\n" или в Lisp a #\Newline отображается на любую запись, которую предпочитает локальная система, по сравнению с "\r" или #\Return, когда требуется конкретный символ байта.