В Java, если вы определяете int с ведущим «0», означает, что вы определяете число в Octal.
int a = 08 выдает ошибку вне диапазона, потому что нет никакого число '8' в октябре. Octal предоставляет только 0-7 номеров.
Если вы определяете a = 07, то это не дает ошибку вне диапазона, потому что цифры «0» и «7» находятся в пределах Octal.
Что Вы получаете, когда Вы делаете puts lines
? Это даст Вам ключ к разгадке.
значением по умолчанию File.open
открывает файл в текстовом режиме, таким образом, Ваш \r\n
символы будут автоматически преобразованы в \n
. Возможно, это - причина lines
, всегда равны lines2
. Чтобы препятствовать тому, чтобы Ruby анализировал концы строки, используют rb
режим:
C:\> copy con lala.txt a file with many lines ^Z C:\> irb irb(main):001:0> text = File.open('lala.txt').read => "a\nfile\nwith\nmany\nlines\n" irb(main):002:0> bin = File.open('lala.txt', 'rb').read => "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n" irb(main):003:0>
, Но от Вашего вопроса и кода я вижу, что просто необходимо открыть файл с модификатором по умолчанию. Вы не нуждаетесь ни в каком преобразовании и можете использовать короче File.read
.
Обычно, когда я имею дело с разделением \r или \n, я буду искать обоих путем выполнения чего-то как
lines.gsub(/\r\n?/, "\n");
, я нашел, что в зависимости от того, как данные были сохранены (используемая ОС, редактор использовал, отношение Юпитера к Io в то время) там может или может не быть новая строка после возврата каретки. Действительно кажется странным, что Вы видите оба символа в шестнадцатеричном режиме. Надежда это помогает.
Как насчет следующего?
irb(main):003:0> my_string = "Some text with a carriage return \r"
=> "Some text with a carriage return \r"
irb(main):004:0> my_string.gsub(/\r/,"")
=> "Some text with a carriage return "
irb(main):005:0>
Или...
irb(main):007:0> my_string = "Some text with a carriage return \r\n"
=> "Some text with a carriage return \r\n"
irb(main):008:0> my_string.gsub(/\r\n/,"\n")
=> "Some text with a carriage return \n"
irb(main):009:0>