Укажите кодировку по умолчанию, используя open-uri, но используйте кодировку, предоставленную сервером, если она задана

Используя open() из Ruby open-uri, я хочу получать файлы с произвольных серверов, не находящихся под моим контролем. Серверы могут указывать Content-Type для файла, например text/calendar; charset=utf-8 text/calendar; charset=utf-8 или text/calendar; charset=ISO-8859-1 text/calendar; charset=ISO-8859-1, и в этом случае я рад, что open() будет считать, что кодировка - это то, что требует сервер. Однако, если сервер не указывает кодировку, тогда open() похоже, считает, что кодировка - "ASCII-8BIT". Я хочу, чтобы open() вместо этого предполагал, что кодировка - это "UTF-8" (если не задана кодировка), поскольку text/calendar, то есть "файлы iCal", как правило, кодируются как "UTF-8".

Я делаю упор только на кодировку, когда не задана никакая кодировка, потому что я по-прежнему хочу уважать решения серверов, чтобы, при необходимости, обслуживать файлы в любой кодировке.

Я попытался open('http://my-test-uri.test', 'r:UTF-8'), но это безоговорочно отменяет кодировку, даже если сервер указывает другую кодировку, такую как "ISO-8859-1. "

0
источник поделиться
1 ответ

OpenURI::Meta#charset принимает блок, который вернет кодировку только в том случае, если сервер не указал ее.

Используя эту информацию, мы можем установить кодировку StringIO возвращаемую open либо с той же самой кодировкой, которую она имела (избыточно), либо по умолчанию:

open('http://localhost:3333').tap do |io|
  charset = io.charset { 'utf-8' }
  io.set_encoding(charset)
end
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос