String # encode behebt den Fehler "Ungültige Bytesequenz in UTF-8" nicht

Ich weiß, dass es mehrere ähnliche Fragen zu diesem Fehler gibt, und ich habe viele ohne Glück ausprobiert. Das Problem, das ich habe, betrifft das Byte\xA1 und wirft

ArgumentError: ungültige Bytefolge in UTF-8

Ich habe Folgendes ohne Erfolg versucht:

"\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('', '')

Jede Zeile wirft den Fehler für mich. Was mache ich falsch?

AKTUALISIEREN:

Die obigen Zeilen schlagen nur in IRB fehl. Ich habe meine Anwendung jedoch dahingehend geändert, dass Zeilen einer CVS-Datei mit der gleichen Methode und den gleichen Argumenten für die Zeichenfolgencodierung codiert werden. Beim Lesen der Zeile von a wird der gleiche Fehler angezeigtDatei (Hinweis: Es funktioniert, wenn Sie die Operationen mit derselben Zeichenfolge ohne E / A ausführen).

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage