2012-08-27 22 views
27

¿Cómo borro los caracteres que no son UTF8 de una cadena de rubíes? Tengo una cadena que tiene, por ejemplo, "xC2" en ella. Quiero eliminar ese carácter de la cadena para que se convierta en un UTF8 válido.¿Eliminar caracteres no UTF de una cadena en Ruby?

Este:

text.gsub!(/\xC2/, '') 

devuelve un error:

incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string) 

que estaba viendo text.unpack ('T *') y string.pack también, pero no llegaron a ninguna parte.

+1

Puede encontrar http://stackoverflow.com/questions/11375342/stringencode-not-fixing-invalid-byte-sequence-in-utf-8-error/ useful –

Respuesta

3

Puede utilizar /n, como en

text.gsub!(/\xC2/n, '') 

para forzar la expresión regular para operar en bytes.

¿Estás seguro de que esto es lo que quieres, sin embargo? Cualquier carácter Unicode en el rango [U + 80, U + BF] tendrá un \xC2 en su forma codificada UTF-8.

+1

Esto me da 'coincidencia de codificación regexp incompatible (ASCII) -8BIT regexp con cadena UTF-8) ' –

+0

PERFECT. Gracias. – Dogweather

6

Usted puede hacerlo de esta manera

# encoding: utf-8 

class String 
    def validate_encoding 
    chars.select(&:valid_encoding?).join 
    end 
end 

puts "testing\xC2 a non UTF-8 string".validate_encoding 
#=>testing a non UTF-8 string 
+2

'.select (&: valid_encoding?)' En lugar de '.collect {}' es mucho más corto. – ephemient

+0

tiene la eptemiencia correcta y se mantiene comprensible, gracias, adapto mi respuesta – peter

4

Trate Iconv

1.9.3p194 :001 > require 'iconv' 
# => true 
1.9.3p194 :002 > string = "testing\xC2 a non UTF-8 string" 
# => "testing\xC2 a non UTF-8 string" 
1.9.3p194 :003 > ic = Iconv.new('UTF-8//IGNORE', 'UTF-8') 
# => #<Iconv:0x000000026c9290> 
1.9.3p194 :004 > ic.iconv string 
# => "testing a non UTF-8 string" 
+2

una nota: 'Iconv' está (será) obsoleto de Rails 3.2 a favor de' String # encode' – nikola

64

Puede utilizar codifican para eso. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Para más información mire en Ruby-Docs

+5

Cada vez que vea que tiene 10 puntos de esta respuesta debe saber la cantidad de golpes de cabeza contra un escritorio que acaba de salvar a alguien. – hobberwickey

-1
data = '' if not (data.force_encoding("UTF-8").valid_encoding?) 
0

Usted texto ASCII tienen 8BIT-codificación, en lugar usted debe utilizar este:

String.delete!("^\u{0000}-\u{007F}"); 

Se cortará el mismo propósito.

Cuestiones relacionadas