Как установить размер окна браузера при использовании `google-chrome --headless`?

Вышеупомянутый ответ был на месте. В частности, этот пункт:

Существует различие между force_encoding и encode. Первая устанавливает кодировку для строки, тогда как последняя фактически перекодирует содержимое строки в новую кодировку.

В моей ситуации у меня был текстовый файл с 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.

30
задан Leo Gallucci 21 April 2017 в 12:04
поделиться