2011-01-03 9 views
13

¿Hay una solución para usar String.force_encoding() en Ruby 1.8.7 (o Rails 2.x) para que funcione como en Ruby 1.9? Leí algo sobre require active_support, pero esto no funcionaString.force_encoding() en Ruby 1.8.7 (o Rails 2.x)

$>lista de gemas --local | grep 'rieles \ | ActiveSupport'

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

$>rubí -v

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

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

Respuesta

13

Lo único que hace force_encoding en 1.9 es que cambia el campo de codificación de la cadena, en realidad no modifica los bytes de la cadena.

Ruby 1.8 no tiene el concepto de codificaciones de cadena, por lo que force_encoding sería una operación nula. Puede agregar usted mismo como esto si usted quiere ser capaz de ejecutar el mismo código en 1.8 y 1.9:

class String 
    def force_encoding(enc) 
    self 
    end 
end 

Habrá, por supuesto, otras cosas que hay que hacer para que las codificaciones funcionan de la misma a través de 1,8 y 1.9, ya que manejan este problema de manera muy diferente.

+0

Probablemente una pregunta estúpida, pero ¿en qué parte de mi código debería estar agregando esto? – RealCasually

+0

Cualquier lugar hará, más o menos. Póngalo en un archivo y agregue un 'require' para ese archivo junto con todos sus otros' require's en la parte superior de su '.rb' principal. – Theo

21

Esto le dará Cadena # to_my_utf8 tanto en Rubí y Ruby 1.8.7 1.9:

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

Y entonces ...

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

Inspirado por Paul Battley y también recordar algunos de mis más viejos trabajar en el remote_table gem.

+0

Genial, eso es bueno! – Fu86

+1

Por curiosidad: ¿por qué agregar dos espacios y luego eliminarlos después de la conversión? – Theo

+3

Esa es la contribución de Paul Battley ... como dice, "Los bytes 'peligrosos' son aquellos en el rango de 194-253" ... si el hilo termina con uno de esos, la conversión a veces explota. –