2012-01-03 40 views
25

Giả sử bạn có một chuỗi như "€foo\xA0", được mã hóa UTF-8, Có cách nào để xóa chuỗi byte không hợp lệ khỏi chuỗi này không? (để bạn có được "€foo")Có cách nào trong ruby ​​1.9 để xóa chuỗi byte không hợp lệ khỏi chuỗi không?

Trong ruby-1.8 bạn có thể sử dụng Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "€foo\xA0") nhưng hiện không còn được dùng nữa. "€foo\xA0".encode('UTF-8') không làm bất cứ điều gì, vì nó đã là UTF-8. Tôi cố gắng:

"€foo\xA0".force_encoding('BINARY').encode('UTF-8', :undef => :replace, :replace => '') 

trong đó sản lượng

"foo"

Nhưng điều đó cũng mất ký tự multibyte hợp lệ €

Trả lời

32
"€foo\xA0".chars.select(&:valid_encoding?).join 
+1

Nó không loại bỏ các '\ xF1' trong chuỗi này' "eEspa \ xF1a; FB" ' – Dorian

+1

@Dorian, trên 1.9.3 console IRB,' "eEspa \ xF1a; FB" .chars.select {| i | i.valid_encoding?}. join' trả về '" eEspaa; FB "' ... bạn không nhận được hành vi đó hay tôi đã hiểu lầm? – acobster

34
"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8') 
+0

Tôi có thể hỏi tại sao "UTF-16le" không? – lulalala

+2

Tôi đã có ấn tượng rằng nó có một bộ ký tự lớn hơn UTF-8, có nghĩa là bạn không mất bất kỳ dữ liệu hợp lệ nào. Rất tiếc, những điều sau không hoạt động: '" € foo \ xA0 ".encode ('UTF-8',: invalid =>: replace,: replace => '')' vì chuỗi đã là UTF- 8, do đó, nó sẽ không được mã hóa một lần nữa. –

+0

FWIW, chạy thử nghiệm trên một tệp lớn, tôi thấy phương pháp này có độ lớn nhanh hơn phương pháp 'valid_encoding'. – jwadsack

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

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và sau khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). – Severin

+0

@Severin sao không? Dường như câu trả lời (không chính xác) cho câu hỏi. Nó loại bỏ tất cả các chuỗi byte không hợp lệ từ một chuỗi. Nó chỉ loại bỏ tất cả những cái hợp lệ. –

1

của Ruby 2.0 và 1.9.3

"€foo\xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace) 

của Ruby 2.1+

"€foo\xA0".scrub 
Các vấn đề liên quan