2012-08-27 20 views
27

Come si eliminano caratteri non UTF8 da una stringa di rubini? Ho una stringa che contiene ad esempio "xC2". Voglio rimuovere quel carattere dalla stringa in modo che diventi un UTF8 valido.Elimina caratteri non UTF da una stringa in Ruby?

questo:

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

restituisce un errore:

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

stavo guardando text.unpack ('U *') e string.pack pure, ma non ha ottenuto da nessuna parte.

+1

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

risposta

3

È possibile utilizzare /n, come in

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

per forzare il Regexp per operare su byte.

Sei sicuro che questo è ciò che desideri? Qualsiasi carattere Unicode nell'intervallo [U + 80, U + BF] avrà un \xC2 nella sua forma codificata UTF-8.

+1

Questo mi dà la corrispondenza 'regexp codifica incompatibile (ASCII -8BIT regexp con stringa UTF-8) ' –

+0

PERFETTO. Grazie. – Dogweather

6

Si potrebbe fare in questo modo

# 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?)' Invece di '.collect {}' è molto più corto. – ephemient

+0

hai ragione e ti rimane comprensibile, grazie, adattare la mia risposta – peter

4

Prova 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' è (sarà) deprecato da Rails 3.2 in favore di' String # encode' – nikola

64

È possibile utilizzare la codifica per questo. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Per maggiori informazioni guardare in Ruby-Docs

+5

Ogni volta che vedi che hai 10 punti da questa risposta devi sapere quanta testa sbatti contro una scrivania che hai appena salvato qualcuno. – hobberwickey

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

È testo sono la codifica ASCII-8 BIT, invece si dovrebbe usare questo:

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

Sarà recidere lo stesso scopo.

Problemi correlati