2011-01-03 11 views
13

Ruby 1.8.7(またはRails 2.x)でString.force_encoding()を使用してRuby 1.9のように動作させる方法はありますか? active_supportが必要ですが、これは動作しません。Ruby 1.8.7(またはRails 2.x)のString.force_encoding()

$>gem list --local | grepの 'レール\ | activesupportの'

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

$>ルビー-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 

答えて

13

force_encodingは、文字列のエンコーディングフィールドを変更するだけで、実際には文字列のバイトは変更されません。

Ruby 1.8には文字列エンコーディングの概念がないため、force_encodingはノーオペレーションになります。あなたは1.8と1.9で同じコードを実行できるようにしたい場合は、このようにそれを自分で追加することができます。

class String 
    def force_encoding(enc) 
    self 
    end 
end 

もちろんあなたはエンコーディングは1.8で同じを動作させるためにしなければならない他のものがあります1.9は、この問題を非常に異なる方法で処理するためです。

+0

おそらく愚かな質問ですが、私のコードでこれを追加する必要がありますか? – RealCasually

+0

多かれ少なかれ、どこでもやります。それをファイルに入れて、あなたの "main"の '.rb'の先頭にあなたの他のすべての' require'と一緒に 'require'を追加してください。 – Theo

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で作業してください。

+0

すばらしい、thats素敵! – Fu86

+1

好奇心を要します:なぜスペースを2つ追加してから変換後に削除するのですか? – Theo

+3

Paul Battleyの貢献です... "危険なバイトは194-253の範囲のバイトです" ...文字列がそれらのいずれかで終わると、変換が時々爆発します。 –

関連する問題