2013-05-10 29 views
16

Vì utf8 của MySQL không hỗ trợ 4 ký tự byte, tôi đang tìm cách phát hiện và loại bỏ bất kỳ ký tự utf8 4 byte nào từ một chuỗi trong Ruby. Tôi hiểu rằng tôi có thể cập nhật bảng của mình để sử dụng utf8m4 nhưng vì một vài lý do không thể hoặc giải pháp mong muốn.Làm thế nào để loại bỏ 4 byte utf-8 ký tự trong Ruby?

Chỉ cần mã hóa chuỗi thành ASCII sẽ xóa các ký tự này nhưng cũng sẽ xóa tất cả các ký tự không phải ASCII khác, điều này không tốt.

Trả lời

30

Sau đây dường như làm việc cho tôi trong Ruby 1.9.3:

input.each_char.select{|c| c.bytes.count < 4 }.join('') 

Ví dụ:

input = "hello \xF0\xA9\xB6\x98 world"     # includes U+29D98 
input.each_char.select{|c| c.bytes.count < 4 }.join('') # 'hello world' 
+0

Cảm ơn! Có vẻ rõ ràng bây giờ bạn đã đề xuất nó. Tôi đã quá suy nghĩ về mã hóa, tôi không nghĩ đơn giản chỉ nhìn vào số byte của mỗi nhân vật. – JZC

+0

Hiệu suất của chuỗi này với chuỗi dài như thế nào? 5000 ký tự? –

+0

cảm ơn bạn cảm ơn bạn cảm ơn ... không phải cá nhân lo lắng về hiệu suất, hiện tại tôi rất vui khi có giải pháp làm việc – steve

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