String.force_encoding() в Ruby 1.8.7 (или Rails 2.x)

Есть ли решение использовать String.force_encoding() в Ruby 1.8.7 (или Rails 2.x), чтобы он работал, как в Ruby 1.9? Я прочитал что-то о require active_support, но это не работает.

$ > список драгоценных камней --local | grep 'rails\| activesupport'

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

$ > ruby ​​-v

ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.4.0]

$ > rails -v

Rails 2.3.8

IRB:

> 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

Ответ 1

Единственное, что force_encoding делает в 1.9, состоит в том, что оно меняет поле кодировки строки, оно фактически не изменяет байты строки.

Ruby 1.8 не имеет понятия строковых кодировок, поэтому force_encoding будет no-op. Вы можете добавить его самостоятельно, если хотите, чтобы иметь возможность запускать тот же код в 1,8 и 1,9:

class String
  def force_encoding(enc)
    self
  end
end

Конечно, будут другие вещи, которые вам нужно сделать, чтобы кодировки работали одинаково в 1,8 и 1,9, поскольку они справляются с этой проблемой совсем по-другому.

Ответ 2

Это даст вам строку # to_my_utf8 в Ruby 1.8.7 и Ruby 1.9:

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

И затем...

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

Вдохновленный Paul Battley, а также вспоминая некоторые из моих старых работ над камень удаленной_таблицы.