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

3 ответа3

4

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

Концы строк 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.

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

2

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

0

Что касается фактического бита "почему" - Исторически телетайп использовал возврат каретки (hex 0D), чтобы переместить печатающую головку к левому полю, а затем перевод строки (hex 0A) для продвижения бумаги.

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .