2011-01-03 2 views
13

Esiste una soluzione per utilizzare String.force_encoding() in Ruby 1.8.7 (o Rails 2.x) in modo che funzioni come in Ruby 1.9? Ho letto qualcosa su richiedere active_support, ma questo non funzionaString.force_encoding() in Ruby 1.8.7 (o Rails 2.x)

$>elenco di gemme --local | grep 'rotaie \ | ActiveSupport'

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

$>rubino -v

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

$>rotaie -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 

risposta

13

L'unica cosa che fa force_encoding in 1.9 è che cambia il campo di codifica della stringa, in realtà non modifica i byte della stringa.

Ruby 1.8 non ha il concetto di codifica delle stringhe, quindi force_encoding sarebbe un no-op. È possibile aggiungere voi stessi come questo se si vuole essere in grado di eseguire lo stesso codice in 1.8 e 1.9:

class String 
    def force_encoding(enc) 
    self 
    end 
end 

Ci saranno ovviamente altre cose che si devono fare per rendere codifiche funzionano allo stesso modo in tutto 1.8 e 1.9, dal momento che gestiscono questo problema in modo molto diverso.

+0

Probabilmente una domanda stupida, ma dove dovrei aggiungere questo nel mio codice? – RealCasually

+0

Ovunque andrà, più o meno. Mettilo in un file e aggiungi un 'require' per quel file insieme a tutti gli altri' require's nella parte superiore del tuo "main" '.rb'. – Theo

21

Questo vi darà String # to_my_utf8 sia Rubino 1.8.7 e Ruby 1.9:

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

E poi ...

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

Ispirato Paul Battley e ricordando anche alcuni dei miei più vecchi lavorare su remote_table gem.

+0

Ottimo, questo è bello! – Fu86

+1

Per curiosità: perché aggiungere due spazi e quindi rimuoverli dopo la conversione? – Theo

+3

Questo è il contributo di Paul Battley ... come dice, "I byte 'pericolosi' sono quelli nell'intervallo 194-253" ... se la stringa termina con uno di questi, la conversione a volte esplode. –