Я использую redcarpet gem для рендеринга некоторого текста уценки в html, часть уценки была вставлена пользователем, и они ввели полностью допустимый специальный символ (£
), но теперь при рендеринге я получаю: Encoding::UndefinedConversionError "\xC2" from ASCII-8BIT to UTF-8
Я знаю, что это знак £, потому что если я заменю его в тексте для рендеринга, все будет работать. но они могут вставлять другие специальные символы.
Я не уверен, как с этим справиться, вот мой код, создающий html:
def generate_document
temp_file_service = TempFileService.new
path = temp_file_service.path
template_url = TenantConfig.get('DEPOSIT_GUIDE_TEMPLATE') || DEFAULT_DOC
template = open(template_url, 'rb', &:read)
html = ERB.new(template).result(binding)
File.open( path, 'w') do |f|
f.write html
end
File.new(path, 'r')
end
ошибка возникает на строке f.write
вот мой html.erb:
<%= markdown(clause.text) %>
а вот помощник:
def markdown(text)
Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(text)
end
Обратите внимание, что проблема с кодировкой возникает только при сохранении html в файл, где-то еще я правильно использую тот же помощник уценки для рендеринга текста в браузере, и там нет проблем.
Это будет работать и по-другому, очищая код уценки перед его сохранением в БД и заменяя любые специальные символы соответствующим кодом html (например, £
становится £
)
Я попытался использовать обратный вызов before_save (как предлагается здесь: Encoding::UndefinedConversionError: \xC2 из ASCII-8BIT в UTF-8):
before_save :convert_text
private
def convert_text
self.text = self.text.force_encoding("utf-8")
end
что не сработало
Я также пробовал (как рекомендуется здесь: Использование ERB в Markdown с Redcarpet):
<%= markdown(extra_clause.text).html_safe %>
что тоже не сработало.
Как бы я исправить в любом случае?