https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112012-04-20T04:36:41ZRuby Issue Tracking SystemRuby master - Bug #6324: Spurious/incorrect warning on File.open with internal_encoding specified in string mode to duplicate external_encodinghttps://redmine.ruby-lang.org/issues/6324?journal_id=260222012-04-20T04:36:41Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>duerst (Martin Dürst)</i></li></ul><p>Martin-sensei, Naruse-san, what do you think?</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p> Ruby master - Bug #6324: Spurious/incorrect warning on File.open with internal_encoding specified in string mode to duplicate external_encodinghttps://redmine.ruby-lang.org/issues/6324?journal_id=260822012-04-22T17:34:38Zduerst (Martin Dürst)duerst@it.aoyama.ac.jp
<ul><li><strong>Assignee</strong> changed from <i>duerst (Martin Dürst)</i> to <i>naruse (Yui NARUSE)</i></li></ul><p>In my view, we could/should get rid of this warning. See details below.</p>
<p>jrochkind (jonathan rochkind) wrote:</p>
<blockquote>
<p>Normally, if you open a File specifying an internal_encoding equivalent to an external_encoding, using the string method, it gives you a warning. <em>Normally</em> this warning is possibly appropriate and accurate:</p>
<p>irb(main):018:0* f = File.open("test", "r:cp866:cp866")<br>
(irb):18: warning: Ignoring internal encoding cp866: it is identical to external encoding cp866</p>
</blockquote>
<p>This is actually misleading. The actual internal encoding (the encoding of the Strings read in) is still cp866, so the information isn't ignored. It's just that the "internal_encoding" slot of the file isn't set because it can be deduced from context.</p>
<p>Also, there's really not much harm if a programmer writes File.open("test", "r:cp866:cp866") instead of just File.open("test", "r:cp866"). The warning may help a programmer who wrongly assumes that there's always a need for giving both encodings, but I think documentation should be enough for this.</p>
<blockquote>
<p>However, there is a case where it is NOT. If you have set your Encoding.default_internal</p>
<p>irb(main):019:0> Encoding.default_internal = "UTF-8"<br>
irb(main):020:0> f = File.open("test", "r:cp866:cp866")<br>
(irb):20: warning: Ignoring internal encoding cp866: it is identical to external encoding cp866</p>
<p>In this case, it is neccesary to set the internal_encoding to override the non-nil Encoding.default_internal</p>
<p>The functionality in fact <em>works</em> here, we HAVE succesfully over-ridden the default_internal:</p>
<p>irb(main):022:0> p f.internal_encoding<br>
=> nil<br>
irb(main):023:0> f.read.encoding<br>
=> #<a href="Encoding:IBM866" class="external">Encoding:IBM866</a></p>
<p>So the warning is in fact <em>wrong</em>, the :internal_encoding was NOT ignored, it was used as desired. The warning is also unneccesary, what was being done here makes perfect sense, there's no need for a warning.</p>
</blockquote>
<p>There's an additional case where the warning might not make sense. Assume I open files with variable external encodings that I all want to have the same internal encoding:</p>
<a name="somehow-calculate-ext_enc"></a>
<h1 >somehow calculate ext_enc<a href="#somehow-calculate-ext_enc" class="wiki-anchor">¶</a></h1>
<p>File.open("test", "r:#{ext_enc}:cp866")</p>
<p>Now such a program will work quite well, without warnings. But occasionally, it will produce a warning, namely when it hits a case with ext_enc == "cp866". One could of course rewrite this as<br>
File.open("test", ext_enc == "cp866" ? "r:cp866": "r:#{ext_enc}:cp866")<br>
but this really seems way too complicated. It would be better to get rid of the warning.</p>
<blockquote>
<p>Note that the named argument approach works differnetly, no warning is output (whether or not you've set Encoding.default_internal).</p>
<pre><code>irb(main):024:0> f = File.open("foo", :external_encoding => "cp866", :internal_encoding => "cp866")
=> #<File:foo> # NO WARNING OUTPUT
irb(main):025:0> f.internal_encoding
=> nil # CORRECT
irb(main):026:0> f.read.encoding
=> #<Encoding:IBM866> # CORRECT
</code></pre>
<p>Both the named argument and the permission-string method seem to work properly and equivalently. But only the permission-string argument method gives you an incorrect warning.</p>
</blockquote>
<p>Another good reason to get rid of the warning.</p>
<p>So I hope my opinion is clear. But it wasn't my idea in the first place, so maybe I'm missing something. I'm switching assignee over to Yui.</p> Ruby master - Bug #6324: Spurious/incorrect warning on File.open with internal_encoding specified in string mode to duplicate external_encodinghttps://redmine.ruby-lang.org/issues/6324?journal_id=264572012-05-05T01:14:54Znaruse (Yui NARUSE)naruse@airemix.jp
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>This issue was solved with changeset r35538.<br>
jonathan, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<hr>
<ul>
<li>
<p>io.c (parse_mode_enc): remove warnings 'Ignoring internal encoding'.<br>
<a href="/issues/6324">[ruby-core:44455]</a> [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Spurious/incorrect warning on File.open with internal_encoding specified in string mode to duplic... (Closed)" href="https://redmine.ruby-lang.org/issues/6324">#6324</a>]</p>
</li>
<li>
<p>io.c (io_encoding_set): ditto.</p>
</li>
</ul>