Take the 2-minute tour ×

Is there a solution to use String.force_encoding() in Ruby 1.8.7 (or Rails 2.x) so that it works like in Ruby 1.9? I read something about require active_support, but this does not work

$> gem list --local | grep 'rails\|activesupport'

 activesupport (3.0.3, 2.3.8, 2.3.5)
 rails (2.3.8, 2.3.5)

$> ruby -v


$> rails -v

Rails 2.3.8


> require "rubygems"
=> true 
> require "active_support"
=> true 
> "asdf".force_encoding("UTF-8")
NoMethodError: undefined method `force_encoding' for "asdf":String
> String.respond_to?(:force_encoding)
=> false
share|improve this question
add comment

2 Answers

up vote 11 down vote accepted

The only thing force_encoding does in 1.9 is that it changes the encoding field of the string, it does not actually modify the string's bytes.

Ruby 1.8 doesn't have the concept of string encodings, so force_encoding would be a no-op. You can add it yourself like this if you want to be able to run the same code in 1.8 and 1.9:

class String
  def force_encoding(enc)

There will of course be other things that you have to do to make encodings work the same across 1.8 and 1.9, since they handle this issue very differently.

share|improve this answer
Probably a stupid question, but where in my code should I be adding this? –  RealCasually May 9 '12 at 6:25
Anywhere will do, more or less. Put it in a file and add a require for that file along with all your other requires at the top of your "main" .rb. –  Theo May 10 '12 at 7:06
add comment

This will give you String#to_my_utf8 in both Ruby 1.8.7 and Ruby 1.9:

require 'iconv'
class String
  def to_my_utf8
    ::Iconv.conv('UTF-8//IGNORE', 'UTF-8', self + ' ')[0..-2]

And then...

?> "asdf".to_my_utf8
=> "asdf"

Inspired by Paul Battley and also remembering some of my older work on the remote_table gem.

share|improve this answer
Great, thats nice! –  Fu86 Jan 3 '11 at 15:01
Out of curiosity: why add two spaces and then remove them after the conversion? –  Theo Jan 3 '11 at 15:19
That's Paul Battley's contribution... as he says, "The ‘dangerous’ bytes are those in the range 194-253"... if the string ends with one of those, the conversion sometimes blows up. –  Seamus Abshere Jan 3 '11 at 15:49
Why do you need rubygems? Also, where do you suggest placing the top code? in the controller of every controller you can to use it in? –  AnApprentice Jan 23 '11 at 2:50
I'd say just put require "iconv" once, somewhere, as a matter of style. Good point... we don't need rubygems! –  Seamus Abshere Jan 24 '11 at 14:55
show 2 more comments

Your Answer


