2012-08-27 11 views
27

Jak usunąć znaki inne niż UTF8 z ciągu ruby? Mam ciąg znaków, który ma na przykład "xC2". Chcę usunąć ten znak z łańcucha, aby stał się poprawnym UTF8.Usunąć znaki inne niż UTF z ciągu w Ruby?

to:

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

zwraca błąd:

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

szukałem w text.unpack ('U *') i string.pack jak dobrze, ale nie dostać się gdziekolwiek.

+1

Możesz znaleźć http://stackoverflow.com/questions/11375342/stringencode-not-fixing-invalid-byte-sequence-in-utf-8-error/ useful –

Odpowiedz

3

Można użyć /n, jak w

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

zmusić REGEXP działać na bajtach.

Czy jesteś pewien, że tego właśnie chcesz? Dowolny znak Unicode w zakresie [U + 80, U + BF] będzie miał \xC2 w postaci zakodowanej w UTF-8.

+1

Daje mi to dopasowanie niekompatybilnego kodowania wyrażeń regularnych (ASCII) -8BIT regexp z ciągiem znaków UTF-8) ' –

+0

PERFECT. Dziękuję Ci. – Dogweather

6

Można to zrobić następująco

# 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?)' Zamiast '.collect {}' jest o wiele krótszy. – ephemient

+0

masz rację ephemient i pozostaje niezrozumiały, dzięki, dostosuję moją odpowiedź – peter

4

Spróbuj 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

jedna uwaga: 'Iconv' jest (będzie) przestarzałe z Rails 3.2 na rzecz' String # encode' – nikola

64

można wykorzystywać kodowanie za to. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Aby uzyskać więcej informacji spojrzeć Ruby-Docs

+5

Za każdym razem, gdy zobaczysz, że masz 10 punktów z tej odpowiedzi musisz wiedzieć, jak dużo uderza głową o biurko, które właśnie uratowałeś. – hobberwickey

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

można mieć kodowanie tekstu ASCII-8bit, zamiast tego należy użyć:

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

To będzie zerwać ten sam cel.

Powiązane problemy