Encoding::UndefinedConversionError "\xC2" 从 ASCII-8BIT 到 UTF-8 with redcarpet

Encoding::UndefinedConversionError "\xC2" from ASCII-8BIT to UTF-8 with redcarpet

我正在使用 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" from ASCII-8BIT to UTF-8):

before_save :convert_text

  private

  def convert_text
    self.text = self.text.force_encoding("utf-8")
  end

没用

我也试过了(这里推荐:Using ERB in Markdown with Redcarpet):

        <%= markdown(extra_clause.text).html_safe %>

也没用。

我该如何解决?

最后我通过将 force_encoding("UFT-8") 添加到 html

解决了这个问题

像这样:

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

它修复了它。