Does String#encode in Ruby 1.9.2 have option :fallback?

J

Joey Zhou

My Ruby version is: ruby 1.9.2p180 (2011-02-18) [i386-mingw32]

I find in the installer's help file that String#encode has an option
:fallback.

:fallback Sets the replacement string by the hash for undefined
character. Its key is a such undefined character encoded in source
encoding of current transcoder. Its value can be any encoding until it
can be converted into the destination encoding of the transcoder.

ruby-doc.org has the same explanation:
http://www.ruby-doc.org/core/classes/String.src/M001113.html

However I can't make it effective in my code:

replace_hash = {"\u4ced"=>"x","\u4cd2"=>"y"}
ARGF.each_line do |line|
puts line.encode("gbk", :undef => :replace, :fallback => replace_hash)
end

and I found in this article
(http://www.artima.com/forums/flat.jsp?forum=123&thread=313197), which
said :fallback is new feature in Ruby 1.9.3
I am confused. Can I use :fallback option in latest Ruby 1.9.2p180?
 
Y

Y. NOBUOKA

Hi,

You can use :fallback option on ruby 1.9.2.
I think you must not set :undef option when you use :fallback option.

# example on ruby 1.9.2p180
# U+3042 is a Japanese character, and it cant express in US-ASCII
"\u3042".encode( Encoding::US_ASCII, fallback: { "\u3042" => 'a' } )
#=> "a"
 
J

Joey Zhou

Y. NOBUOKA wrote in post #994724:
Hi,

You can use :fallback option on ruby 1.9.2.
I think you must not set :undef option when you use :fallback option.

# example on ruby 1.9.2p180
# U+3042 is a Japanese character, and it cant express in US-ASCII
"\u3042".encode( Encoding::US_ASCII, fallback: { "\u3042" => 'a' } )
#=> "a"

Thank you! It works.

Is there any tricky skill about the :fallback?


str = "\u4ced\u9d12"
#replace_hash = {"\u4ced"=>"x"}
replace_hash = Hash.new {|hash,key| "[#{key.ord}]"}
print str.encode("gbk", fallback: replace_hash)

I want to do this, but failed. It seems :fallback cannot be a dynamic
hash?
 
Y

Y. NOBUOKA

I want to do this, but failed. It seems :fallback cannot be a dynamic

No, it can't on ruby 1.9.2p180...
However, this feature has been requested and was accepted [1],
so you can use this feature on ruby 1.9.3dev!

[1] http://redmine.ruby-lang.org/issues/4125 (Japanese)


$ ruby -v
ruby 1.9.3dev (2011-04-24 trunk 31329) [x86_64-linux]

$ irb
ruby-head :001 > h = Hash.new{ 'a' }
=> {}
ruby-head :002 > "\u3042".encode Encoding::ASCII, fallback: h
=> "a"
 
J

Joey Zhou

Y. NOBUOKA wrote in post #994739:
No, it can't on ruby 1.9.2p180...
However, this feature has been requested and was accepted [1],

Quite a good feature!

Thank you!

Joey
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,998
Messages
2,570,242
Members
46,834
Latest member
vina0631

Latest Threads

Top