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

328
Kyle Piira

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

0
https://en.wikipedia.org/wiki/Newline phuclv 7 лет назад 0
[Почему разные окончания строк - Unix против Windows] (http://superuser.com/q/168123/241386) phuclv 7 лет назад 2
О, прекрасные воспоминания о борьбе с совместимостью, чтобы победить проприетарные системы, о небольших войнах Endian и Big Endian между Intel и Motorola и о том, как плохо заканчиваются строки из-за перемещения текстовых файлов между * nix, DOS и Apple ... И DOS решил стать пишущей машинкой. Fiasco Labs 7 лет назад 0

3 ответа на вопрос

4
txtechhelp

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

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

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

Прежде чем кто-либо спросит о разнице, преобразования в КБ на самом деле составляют 3123,90 для Unix и 3248,86 для Windows, которые округляют цифры, цитируемые спрашивающим, а не усеченные значения, которые вы цитируете. AFH 7 лет назад 1
@AFH, спасибо за улов! Я использовал бинарный калькулятор (без плавающей запятой), когда я делал вычисления :) txtechhelp 7 лет назад 0
Я думал, что это, вероятно, так. AFH 7 лет назад 0
2
David Schwartz

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

0
BRPocock

As for the actual "why" bit — Historically, a teletypewriter used Carriage Return (hex 0D) to move the print head to the left margin, followed by a Line Feed (hex 0A) to advance the paper.

Commodore, Atari, and (pre-Unix) Apple kept the Carriage Return as their line-ending symbol; Unix kept the Line Feed; and CP/M / DOS kept both.

Many Internet protocols (eg, HTTP) still are defined in terms of both (aka "CRLF"), but in actual text files, the only program on Windows that I've encountered that doesn't deal correctly with "just" a Line Feed is Notepad.

Technically, the term "Newline" exists just to mask this historical difference. Eg, in C a "\n" or in Lisp a #\Newline maps to whichever notation the local system happens to prefer, compared to "\r" or #\Return when one particular byte-character is wanted specifically.