Thỉnh thoảng tôi có các ký tự không in được ở giữa một chuỗi. Những chuỗi này là đầu vào của người dùng, vì vậy tôi phải làm cho chương trình của tôi nhận được nó tốt thay vì cố gắng thay đổi nguồn của vấn đề.Làm thế nào để loại bỏ các ký tự không thể in/vô hình trong ruby?
Ví dụ: họ có thể có zero width no-break space trong số giữa của chuỗi. Ví dụ: khi phân tích cú pháp tệp .po
, một phần có vấn đề là chuỗi "he is a man of god"
ở giữa tệp. Trong khi đó tất cả mọi thứ dường như đúng, kiểm tra nó với irb
show:
"he is a man of god".codepoints
=> [104, 101, 32, 105, 115, 32, 97, 32, 65279, 109, 97, 110, 32, 111, 102, 32, 103, 111, 100]
Tôi tin rằng tôi biết một BOM
là gì, và tôi thậm chí xử lý nó độc đáo. Tuy nhiên đôi khi tôi có các ký tự như vậy ở giữa tệp, vì vậy nó không phải là BOM
.
cách tiếp cận hiện tại của tôi là để loại bỏ tất cả các ký tự mà tôi tìm thấy ác trong một thời trang thực sự có mùi:
text = (text.codepoints - CODEPOINTS_BlACKLIST).pack("U*")
Các gần nhất tôi nhận được sau this post mà pha chì tôi để :print:
tùy chọn trên regexps. Tuy nhiên nó không tốt cho tôi:
"m".scan(/[[:print:]]/).join.codepoints
=> [65279, 109]
vì vậy câu hỏi là: Làm thế nào tôi có thể loại bỏ tất cả các ký tự không thể in từ một chuỗi trong ruby?
Nó sẽ giúp ích rất nhiều nếu bạn hiển thị nhiều chuỗi nguồn và mẫu hơn với các ký tự bạn đang cố xử lý. Mẫu hiện tại không giúp ích nhiều khi cố gắng xác định mã số hoặc các giá trị khác mà bạn đang gặp phải. –
@theTinMan Cảm ơn, tôi đã chỉnh sửa câu hỏi bằng một chút chi tiết. Bộ ký tự là UTF-8, tôi tin, nhưng tôi không luôn có thông tin, tôi nhận được nhiều tệp không có BOM. Điều này tôi cho rằng nó ít nhất là một phần unicode bằng cách nhìn vào bản dịch tiếng Trung. – fotanus
Ruby có một phương thức trên String được gọi là 'dump', tạo ra một chuỗi mới với các ký tự không in được loại bỏ và các ký tự đặc biệt được thoát. Tài liệu cho [String # dump] (https://ruby-doc.org/core-2.3.0/String.html#method-i-dump) Ruby 2.3.0 nhưng tôi có thể xác nhận rằng nó nằm trong tài liệu sớm nhất là 1.8.7. – Aaron