Вышеупомянутый ответ был на месте. В частности, этот пункт:
Существует различие между force_encoding и encode. Первая устанавливает кодировку для строки, тогда как последняя фактически перекодирует содержимое строки в новую кодировку.
blockquote>В моей ситуации у меня был текстовый файл с iso-8859-1 кодирование. По умолчанию Ruby использует кодировку UTF-8, поэтому, если вы попытаетесь прочитать файл без указания кодировки, вы получите ошибку:
results = File.read(file) results.encoding => #<Encoding:UTF-8> results.split("\r\n") ArgumentError: invalid byte sequence in UTF-8
Вы получаете неверную ошибку последовательности байтов, потому что символы в разных кодировках представлены разными байтовыми длинами. Следовательно, вам нужно будет указать кодировку в API файлов. Подумайте об этом как force_encoding:
results = File.read(file, encoding: "iso-8859-1")
Итак, все хорошо? Нет, нет, если вы хотите начать синтаксический разбор строки iso-8859-1 с кодировкой символов UTF-8:
results = File.read(file, encoding: "iso-8859-1") results.each do |line| puts line.split('¬') end Encoding::CompatibilityError: incompatible character encodings: ISO-8859-1 and UTF-8
Почему эта ошибка? Потому что '¬' представляется как UTF-8. Вы используете последовательность символов UTF-8 для строки ISO-8859-1. Это несовместимые кодировки. Следовательно, после чтения файла как ISO-8859-1, вы можете попросить Ruby закодировать этот ISO-8859-1 в UTF-8. И теперь вы будете работать с строками UTF-8 и, следовательно, не будет проблем:
results = File.read(file, encoding: "iso-8859-1").encode('UTF-8') results.encoding results = results.split("\r\n") results.each do |line| puts line.split('¬') end
В конечном счете, с некоторыми API-интерфейсами Ruby, вам не нужно использовать
force_encoding('ISO-8859-1')
. Вместо этого вы просто указываете ожидаемую кодировку API. Однако вы должны преобразовать его обратно в UTF-8, если вы планируете анализировать его с помощью строк UTF-8.