Nano Hash - криптовалюты, майнинг, программирование

Encoding::UndefinedConversionError \xC2 из ASCII-8BIT в UTF-8 с красной ковровой дорожкой

Я использую 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 (например, £ становится &#xA3;)

Я попытался использовать обратный вызов 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 %>

что тоже не сработало.

Как бы я исправить в любом случае?


  • ASCII-8BIT не существует, поэтому я предполагаю, что Ruby не знает, как преобразовать такой байт в Unicode (просто потому, что в любом ASCII нет определения такого байта). £ становится £* Я бы никогда не использовал такое преобразование. Давным-давно мы использовали (иногда, но часто неправильно) латиницу-1.&#x такая непереносимая и очень старая. Почему бы не сохранить весь стек в Unicode? 16.02.2021

Ответы:


1

в конце концов я решил это, добавив force_encoding("UFT-8") в html

нравится:

      f.write html.force_encoding("UTF-8")

это исправило это.

17.02.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..