2012-08-27 36 views
27

Làm cách nào để xóa các ký tự không phải UTF8 khỏi chuỗi ruby? Tôi có một chuỗi có ví dụ "xC2" trong đó. Tôi muốn loại bỏ char đó khỏi chuỗi sao cho nó trở thành một UTF8 hợp lệ.Xóa các ký tự không phải UTF khỏi một chuỗi trong Ruby?

này:

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

trả về một lỗi:

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

tôi đang tìm kiếm tại text.unpack ('U *') và string.pack là tốt, nhưng đã không nhận được bất cứ nơi nào.

+1

Bạn có thể tìm thấy http://stackoverflow.com/questions/11375342/stringencode-not-fixing-invalid-byte-sequence-in-utf-8-error/ hữu ích –

Trả lời

3

Bạn có thể sử dụng /n, như trong

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

để buộc các biểu thức chính quy để hoạt động trên byte.

Bạn có chắc chắn đây là điều bạn muốn không? Bất kỳ ký tự Unicode nào trong phạm vi [U + 80, U + BF] sẽ có \xC2 ở dạng mã hóa UTF-8 của nó.

+1

Điều này mang lại cho tôi 'so khớp mã hóa không tương thích regexp (ASCII -8BIT regexp với chuỗi UTF-8) ' –

+0

HOÀN THÀNH. Cảm ơn bạn. – Dogweather

6

Bạn có thể làm điều đó như thế này

# 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?)' Thay vì '.collect {}' ngắn hơn rất nhiều. – ephemient

+0

you'r đúng ephemient và nó vẫn còn dễ hiểu, cảm ơn, tôi thích ứng với câu trả lời của tôi – peter

4

Hãy thử 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

một lưu ý: 'Iconv' là (sẽ được) không được chấp nhận từ Rails 3.2 ủng hộ' String # encode' – nikola

64

Bạn có thể sử dụng mã hóa cho điều đó. text.encode('UTF-8', :invalid => :replace, :undef => :replace)

Để biết thêm thông nhìn vào Ruby-Docs

+5

Mỗi khi bạn thấy rằng bạn có 10 điểm từ câu trả lời này, bạn phải biết bao nhiêu đầu đập vào bàn bạn vừa cứu một ai đó. – hobberwickey

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

Giải pháp tốt nhất cho vấn đề này mà tôi đã tìm thấy là câu trả lời này đến cùng một câu hỏi: https://stackoverflow.com/a/8711118/363293.

Nói tóm lại: "€foo\xA0".chars.select(&:valid_encoding?).join

0

Bạn văn bản có mã hóa ASCII-8 bit, thay vào đó bạn nên sử dụng này:

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

Nó sẽ cắt đứt cùng một mục đích.

Các vấn đề liên quan