2015-04-26 17 views
7

Tôi đang cố gắng để chạy một kịch bản Ruby, và luôn luôn nhận được một lỗi trên dòng này:chuỗi byte không hợp lệ trong UTF-8 (ArgumentError)

file_content.gsub(/dr/i,'med') 

Nơi tôi đang cố gắng để thay thế "dr" bởi "med".

Lỗi này là:

program.rb:4:in `gsub': invalid byte sequence in UTF-8 (ArgumentError) 

Tại sao đó, làm thế nào tôi có thể khắc phục vấn đề này?

Tôi đang làm việc trên máy MAC OS X Yosemite, với Ruby 2.2.1p85.

+0

Từ tên biến có vẻ như bạn đang đọc dữ liệu từ một tệp - có đúng không? Tệp này đến từ đâu và bạn đọc nó như thế nào? Bạn có biết mã hóa thực sự của tệp không? – matt

Trả lời

12

Có lẽ chuỗi của bạn không có trong định dạng UTF-8, vì vậy sử dụng

if ! file_content.valid_encoding? 
    s = file_content.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8') 
    s.gsub(/dr/i,'med') 
end 

Xem "Ruby 2.0.0 String#Match ArgumentError: invalid byte sequence in UTF-8".

+0

Cảm ơn bạn đã trả lời. Làm cách nào để sử dụng đoạn mã bạn đã cung cấp? Kể từ khi tôi sử dụng nó ngay lập tức trong chương trình của tôi, tôi nhận được: undefined local variable hoặc method 's 'cho main: Object (NameError). Cảm ơn – Simplicity

+0

sử dụng 'file_content' thay vì 's' –

+0

Trước dòng tôi hiển thị trong câu hỏi của mình, tôi có dòng mã sau đây:" file_content = IO.read (filename) ". Tôi đã đặt mã của bạn sau dòng này và trước dòng trong câu hỏi của tôi và thực sự vẫn gặp sự cố tương tự – Simplicity

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