[ruby-core:81880] [Ruby trunk Bug#13350] File.read :newline option not respected on Linux

From: nobu@...
Date: 2017-07-01 13:08:04 UTC
List: ruby-core #81880
Issue #13350 has been updated by nobu (Nobuyoshi Nakada).


`newline: universal` does not imply text mode.
...but it seems nice even if the `newline:` option enables it.

----------------------------------------
Bug #13350: File.read :newline option not respected on Linux
https://bugs.ruby-lang.org/issues/13350#change-65608

* Author: larskanis (Lars Kanis)
* Status: Open
* Priority: Normal
* Assignee: 
* 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: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next