Hi,

At Mon, 25 Apr 2011 22:57:52 +0900,
James Gray wrote in [ruby-core:35878]:
> The issue is that a mode of "rb" is being used to suppress newline
> translation on Windows.  However, that's also switching my Encoding to
> ASCII-8BIT.  Usually I love that feature, but here it's not what I want.  Is
> there anyway to shut off the translation and not get the encoding change?

Now fixed so that universal_newline: false can work.  What's
about the following patch?


diff --git i/lib/csv.rb w/lib/csv.rb index 1aad2f3..d51cb55 100644 --- i/lib/csv.rb +++ w/lib/csv.rb @@ -1334,10 +1334,18 @@ class CSV def self.open(*args) # find the +options+ Hash options = if args.last.is_a? Hash then args.pop else Hash.new end - # default to a binary open mode - args << "rb" if args.size == 1 and !options.key?(:mode) - # wrap a File opened with the remaining +args+ - csv = new(File.open(*args, options), options) + # wrap a File opened with the remaining +args+ with no newline + # decorator + file_opts = {universal_newline: false}.merge(options) + begin + f = File.open(*args, file_opts) + rescue ArgumentError => e + throw unless /needs binmode/ =~ e.message and args.size == 1 + args << "rb" + file_opts = {encoding: Encoding.default_external}.merge(file_opts) + retry + end + csv = new(f, options) # handle blocks like Ruby's open(), not like the CSV library if block_given? @@ -1398,11 +1406,8 @@ class CSV # <tt>encoding: "UTF-32BE:UTF-8"</tt> would read UTF-32BE data from the file # but transcode it to UTF-8 before CSV parses it. # - def self.read(path, options = Hash.new) - encoding = options.delete(:encoding) - mode = "rb" - mode << ":#{encoding}" if encoding - open(path, mode, options) { |csv| csv.read } + def self.read(path, *options) + open(path, *options) { |csv| csv.read } end # Alias for CSV::read(). diff --git i/test/csv/test_encodings.rb w/test/csv/test_encodings.rb index 3880f3a..54c34f3 100755 --- i/test/csv/test_encodings.rb +++ w/test/csv/test_encodings.rb @@ -79,6 +79,21 @@ class TestCSV::Encodings < TestCSV end end + def test_read_with_default_encoding + data = "abc" + default_external = Encoding.default_external + each_encoding do |encoding| + File.open(@temp_csv_path, "wb", encoding: encoding) {|f| f << data} + begin + Encoding.default_external = encoding + result = CSV.read(@temp_csv_path)[0][0] + ensure + Encoding.default_external = default_external + end + assert_equal(encoding, result.encoding) + end + end + ####################################################################### ### Stress Test ASCII Compatible and Non-ASCII Compatible Encodings ### #######################################################################
-- Nobu Nakada