From 94b6933d1c6f4c8698319fbcac9dcecc9033b4b9 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Mon, 7 Dec 2020 17:48:37 +0100 Subject: Set default for Encoding.default_external to UTF-8 on Windows (#2877) * Use UTF-8 as default for Encoding.default_external on Windows * Document UTF-8 change on Windows to Encoding.default_external fix https://bugs.ruby-lang.org/issues/16604 --- encoding.c | 4 +++- ruby.c | 7 +++++-- spec/ruby/command_line/dash_upper_k_spec.rb | 4 ++-- spec/ruby/library/stringio/binmode_spec.rb | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/encoding.c b/encoding.c index e1441caec2..64748ceb27 100644 --- a/encoding.c +++ b/encoding.c @@ -1684,7 +1684,9 @@ rb_enc_default_external(void) * File data written to disk will be transcoded to the default external * encoding when written, if default_internal is not nil. * - * The default external encoding is initialized by the locale or -E option. + * The default external encoding is initialized by the -E option. + * If -E isn't set, it is initialized to UTF-8 on Windows and the locale on + * other operating systems. */ static VALUE get_default_external(VALUE klass) diff --git a/ruby.c b/ruby.c index 2ddea6b430..c01d78ef7e 100644 --- a/ruby.c +++ b/ruby.c @@ -1819,6 +1819,9 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) Init_ruby_description(); Init_enc(); lenc = rb_locale_encoding(); +#if UTF8_PATH + uenc = rb_utf8_encoding(); +#endif rb_enc_associate(rb_progname, lenc); rb_obj_freeze(rb_progname); parser = rb_parser_new(); @@ -1839,7 +1842,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) enc = rb_enc_from_index(opt->ext.enc.index); } else { - enc = lenc; + enc = IF_UTF8_PATH(uenc, lenc); } rb_enc_set_default_external(rb_enc_from_encoding(enc)); if (opt->intern.enc.index >= 0) { @@ -1944,7 +1947,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) enc = rb_enc_from_index(opt->ext.enc.index); } else { - enc = lenc; + enc = IF_UTF8_PATH(uenc, lenc); } rb_enc_set_default_external(rb_enc_from_encoding(enc)); if (opt->intern.enc.index >= 0) { diff --git a/spec/ruby/command_line/dash_upper_k_spec.rb b/spec/ruby/command_line/dash_upper_k_spec.rb index a060eab793..7e71532295 100644 --- a/spec/ruby/command_line/dash_upper_k_spec.rb +++ b/spec/ruby/command_line/dash_upper_k_spec.rb @@ -58,8 +58,8 @@ describe 'The -K command line option' do end it "ignores unknown codes" do - locale = Encoding.find('locale') + external = Encoding.find('external') ruby_exe(@test_string, options: '-KZ').should == - [Encoding::UTF_8.name, locale.name, nil].inspect + [Encoding::UTF_8.name, external.name, nil].inspect end end diff --git a/spec/ruby/library/stringio/binmode_spec.rb b/spec/ruby/library/stringio/binmode_spec.rb index 83178787f3..853d9c9bd6 100644 --- a/spec/ruby/library/stringio/binmode_spec.rb +++ b/spec/ruby/library/stringio/binmode_spec.rb @@ -9,7 +9,7 @@ describe "StringIO#binmode" do it "changes external encoding to BINARY" do io = StringIO.new - io.external_encoding.should == Encoding.find('locale') + io.external_encoding.should == Encoding.find('external') io.binmode io.external_encoding.should == Encoding::BINARY end -- cgit v1.2.3