Bug #8445 and IO#set_enconding does not support :fallback option

Added by pjmtdw (Haruhiro Yoshimoto) almost 4 years ago. Updated about 3 years ago.

Target version:
ruby -v:
trunk(ruby 2.1.0dev)


RubyDoc says that and IO#set_encoding supports optional argument defined in String#encode.
In fact, :invalid, :undef and :replace works as expected.

However, :fallback option does not work neither for and IO#set_encoding.
Following is the example code which does not work.
f(x) is never called even if hoge.txt contains non convertible character."./hoge.txt","r:Shift_JIS:utf-8", :fallback => lambda{|x|f(x)}){|f|
f.set_encoding("Shift_JIS","utf-8",:fallback => lambda{|x|f(x)})

I Think this is because fill_cbuf() in io.c calls rb_econv_convert() from transcode.c directly.
On the other hand, fallback_func is called in transcode_loop(), which is called by str_encode().

Since transcode_loop() also calls rb_econv_convert(), I wrote a small patch which moves some codes from
transcode_loop() to rb_econv_convert() to fix the problem.

The attached file is the patch. Hope this helps.

support-fallback-for-io.patch View (3.9 KB) pjmtdw (Haruhiro Yoshimoto), 05/24/2013 10:03 PM


#1 [ruby-dev:47373] Updated by naruse (Yui NARUSE) almost 4 years ago

  • Category set to M17N
  • Status changed from Open to Assigned
  • Assignee set to akr (Akira Tanaka)
  • Target version set to 2.1.0

Is this intentional or just unexpected inconsistency?

#2 [ruby-dev:47934] Updated by hsbt (Hiroshi SHIBATA) about 3 years ago

  • Target version changed from 2.1.0 to 2.2.0

Also available in: Atom PDF