2012-08-27 12 views
27

Wie lösche ich Nicht-UTF8-Zeichen aus einer Ruby-Zeichenfolge? Ich habe eine Zeichenfolge, die zum Beispiel "xC2" enthält. Ich möchte dieses Zeichen aus der Zeichenfolge entfernen, so dass es ein gültiges UTF8 wird.Löschen Sie Nicht-UTF-Zeichen aus einer Zeichenfolge in Ruby?

Dies:

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

gibt einen Fehler zurück:

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

Ich war auf der Suche text.unpack ('U *') und string.pack als gut, aber nicht überall.

+1

Sie könnten http://stackoverflow.com/questions/11375342/stringencode-not-fixing-invalid-byte-sequence-in-utf-8-error/ nützlich –

Antwort

3

Sie können /n, wie in

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

um die Regexp Gewalt auf Bytes zu betreiben.

Sind Sie sicher, dass dies das ist, was Sie wollen? Jedes Unicode-Zeichen im Bereich [U + 80, U + BF] hat eine \xC2 in seiner UTF-8-codierten Form.

+1

Dies gibt mir inkompatible Codierung regexp Übereinstimmung (ASCII -8BIT regexp mit UTF-8 string) ' –

+0

PERFEKT. Vielen Dank. – Dogweather

6

Sie könnten es tun, wie diese

# 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?)' Anstelle von '.collect {}' ist viel kürzer. – ephemient

+0

du hast recht ephemient und es bleibt nachvollziehbar, danke, ich passe meine antwort an – peter

4

Versuchen 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

ein hinweis: 'Iconv' ist (wird) von Rails 3.2 zugunsten von' String # encode' veraltet – nikola

64

Sie kodieren für das verwenden können. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Für weitere Informationen schauen Sie in Ruby-Docs

+5

Jedes mal wenn du siehst hast du 10 Punkte von dieser Antwort müssen Sie wissen, wie viel Kopf gegen einen Schreibtisch hämmern Sie gerade jemand gespeichert haben. – hobberwickey

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

Sie Text haben ASCII-8BIT Codierung, stattdessen sollten Sie verwenden:

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

Es wird den gleichen Zweck durchtrennen.

Verwandte Themen