2013-05-13 40 views
6

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?

+0

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. –

+0

@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

+0

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

Trả lời

2

Ruby có thể giúp bạn chuyển đổi từ một bộ ký tự nhiều byte sang bộ ký tự khác. Kiểm tra vào these search results, cộng với đọc trên phương pháp encode của Ruby String.

Ngoài ra, của Ruby là Iconv là bạn của bạn.

Cuối cùng, James Gray đã viết series of articles bao gồm chi tiết này.

Một trong những điều bạn có thể làm bằng cách sử dụng những công cụ này là yêu cầu họ chuyển mã thành một ký tự tương tự trực quan hoặc bỏ qua chúng hoàn toàn.

Xử lý các bộ ký tự thay thế là một trong những điều khó chịu nhất mà tôi từng phải làm, bởi vì tệp có thể chứa bất kỳ thứ gì, nhưng được đánh dấu là văn bản. Bạn có thể không mong đợi nó và sau đó mã của bạn chết hoặc bắt đầu ném lỗi, bởi vì mọi người rất khéo léo khi tìm ra cách để chèn các ký tự thay thế vào nội dung.

+0

Gave up .. Tôi nghĩ rằng không có cách nào tốt hơn để xử lý các tập tin không đúng định dạng. Tuy nhiên tôi chấp nhận câu trả lời của bạn bởi vì đó là một hướng dẫn tốt cho những người kết thúc ở đây với các tập tin cũng được hình thành. – fotanus

12

thử điều này:

>>"aaa\f\d\x00abcd".gsub(/[^[:print:]]/,'.') 
=>"aaa.d.abcd" 
0

Tôi cũng đã có cùng một vấn đề trong phiên bản ROR 3.9.3, và tôi đã sử dụng Visual Studio 2010 là biên tập viên của tôi. Notepad ++ đã giải quyết được vấn đề của tôi.

Nếu bạn đang sử dụng Notepad ++ và vấn đề là trong một file UTF-8:

  1. Mở tệp
  2. Trong menu Encoding chọn "Mã hóa theo UTF-8 mà không BOM như trong ảnh chụp màn hình

Screenshot where it showing the aforesaid menu item

Để biết thêm chi tiết Refer this

+0

Khi downvoting một câu trả lời hoặc câu hỏi, downvoter cần phải bình luận tại sao ông downvoted. – Ravimallya

+3

Anh ấy đang hỏi về trợ giúp trong Ruby, vì vậy giải pháp cần sử dụng Ruby/RoR, không phải là notepad ++ –

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