Ruby 1.8.7(或Rails 2.x)中的String.force_encoding()

时间:2011-01-03 11:06:40

标签: ruby-on-rails ruby encoding gem

是否有在Ruby 1.8.7(或Rails 2.x)中使用String.force_encoding()的解决方案,以便它像Ruby 1.9一样工作?我读了一些关于require active_support的内容,但这不起作用

$> 宝石列表 - 本地| 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

2 个答案:

答案 0 :(得分:21)

这将在Ruby 1.8.7和Ruby 1.9中为您提供String#to_my_utf8:

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的启发,并且还记得remote_table gem上的一些旧作品。

答案 1 :(得分:14)

1.9中force_encoding唯一的作用是它改变了字符串的编码字段,它实际上并没有修改字符串的字节。

Ruby 1.8没有字符串编码的概念,因此force_encoding将是一个无操作。如果您希望能够在1.8和1.9中运行相同的代码,可以像这样自己添加:

class String
  def force_encoding(enc)
    self
  end
end

当然,要使编码在1.8和1.9中的工作方式相同,你必须要做的其他事情,因为他们处理这个问题的方式截然不同。