From: hsbt@... Date: 2017-07-14T08:35:11+00:00 Subject: [ruby-core:82057] [Ruby trunk Bug#13350][Assigned] File.read :newline option not respected on Linux Issue #13350 has been updated by hsbt (Hiroshi SHIBATA). Status changed from Open to Assigned Assignee set to nobu (Nobuyoshi Nakada) ---------------------------------------- Bug #13350: File.read :newline option not respected on Linux https://bugs.ruby-lang.org/issues/13350#change-65787 * Author: larskanis (Lars Kanis) * Status: Assigned * Priority: Normal * Assignee: nobu (Nobuyoshi Nakada) * Target version: * ruby -v: ruby 2.5.0dev (2017-03-21 trunk 58044) [x86_64-linux] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- ## Reproducable in irb All examples run with: ` Encoding.default_external = 'utf-8' Encoding.default_internal = nil ` ### on Linux (unexpected behavior) Prepare a file with CRLF newline characters ` File.write("crlf.txt", "a\nb\nc", newline: :crlf) # => 7 File.binread("crlf.txt") # => "a\r\nb\r\nc" ` While read the files newline characters are only converted if internal and external encoding differ like here: ` File.read("crlf.txt", mode: "r:utf-8:cp850", newline: :universal) # => "a\nb\nc" ` But if the encoding isn't changed, the newline character is not converted: ` File.read("crlf.txt", newline: :universal) # => "a\r\nb\r\nc" File.read("crlf.txt", mode: "r:utf-8:utf-8", newline: :universal) # => "a\r\nb\r\nc" File.open("crlf.txt", "r:utf-8:utf-8", newline: :universal, &:read) # => "a\r\nb\r\nc" ` I would expect to get: ` File.read("crlf.txt", newline: :universal) # => "a\nb\nc" ` ... but the :newline option seems to be ignored, when read without encoding conversion. ### on Windows (expected behavior) In contrast, on Windows the same commands returns in only 5 bytes to be written, but the content of the file is the same as on Linux: ` File.write("crlf.txt", "a\nb\nc", newline: :crlf) # => 5 File.binread("crlf.txt") # => "a\r\nb\r\nc" ` Due to the default CRLF->LF conversion on Windows, the newline option isn't necessary to get a CRLF->LF conversion. But setting newline to :cr shows, that the :newline option is respected as expected. ` File.read("crlf.txt", newline: :universal) # => "a\nb\nc" File.read("crlf.txt", newline: :cr) # => "a\r\nb\r\nc" ` -- https://bugs.ruby-lang.org/ Unsubscribe: