String.force_encoding () в Ruby 1.8.7 (или Rails 2.x) - PullRequest
13 голосов
/ 03 января 2011

Есть ли решение использовать 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]

$> рельсы -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

Ответы [ 2 ]

21 голосов
/ 03 января 2011

Это даст вам строку # 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"

Вдохновлен Полом Батли, а также вспоминаю некоторые из моих старых работ с remote_table gem .

14 голосов
/ 03 января 2011

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

В Ruby 1.8 нет концепции кодирования строки,так что force_encoding будет неактивным.Вы можете добавить его сами, например, если вы хотите иметь возможность запускать один и тот же код в 1.8 и 1.9:

class String
  def force_encoding(enc)
    self
  end
end

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

...