Tôi biết có nhiều câu hỏi tương tự về lỗi này và tôi đã thử nhiều người trong số họ mà không gặp may. Vấn đề tôi đang gặp liên quan đến việc byte \xA1
và được némChuỗi # mã hóa không sửa "chuỗi byte không hợp lệ trong UTF-8" lỗi
ArgumentError: invalid byte sequence in UTF-8
Tôi đã thử những điều sau đây không có thành công:
"\xA1".encode('UTF-8', :undef => :replace, :invalid => :replace,
:replace => "").sub('', '')
"\xA1".encode('UTF-8', :undef => :replace, :invalid => :replace,
:replace => "").force_encoding('UTF-8').sub('', '')
"\xA1".encode('UTF-8', :undef => :replace, :invalid => :replace,
:replace => "").encode('UTF-8').sub('', '')
Mỗi dòng ném lỗi cho tôi. Tôi đang làm gì sai?
UPDATE:
Các dòng trên không chỉ trong IRB. Tuy nhiên, tôi đã sửa đổi ứng dụng của mình để mã hóa các dòng của tệp CVS bằng cách sử dụng cùng phương thức và phương thức mã hóa String # và tôi gặp lỗi tương tự khi đọc dòng từ tệp (lưu ý: nó hoạt động nếu bạn thực hiện các thao tác trên cùng một chuỗi w/o bằng cách sử dụng IO).
bad_line = "col1\tcol2\tbad\xa1"
bad_line.sub('', '') # does NOT fail
puts bad_line # => col1 col2 bad?
tmp = Tempfile.new 'foo' # write the line to a file to emulate real problem
tmp.puts bad_line
tmp.close
tmp2 = Tempfile.new 'bar'
begin
IO.foreach tmp.path do |line|
line.encode!('UTF-8', :undef => :replace, :invalid => :replace, :replace => "")
line.sub('', '') # fail: invalid byte sequence in UTF-8
tmp2.puts line
end
tmp2.close
# this would fail if the above error didn't halt execution
CSV.foreach(tmp2.path) do |row|
puts row.inspect # fail: invalid byte sequence in UTF-8
end
ensure
tmp.unlink
tmp2.close
tmp2.unlink
end
Không có dòng nào trong số này ném lỗi trên máy của tôi với MRI 1.9.3p125. –
Tôi gặp phải các lỗi này trong IRB khi sử dụng MRI 1.9.3p194. – joshm1