首页 > 解决方案 > Encoding::UndefinedConversionError "\xC2" from ASCII-8BIT to UTF-8 with redcarpet

问题描述

我正在使用 redcarpet gem 将一些 markdown 文本呈现为 html,一部分 markdown 是用户插入的,他们输入了一个完全有效的特殊字符 ( £),但现在在呈现它时我得到: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 保存到文件时发生,在其他地方我正确使用相同的 markdown 助手将文本呈现到浏览器,并且没有问题。

它也可以以另一种方式工作,在将降价代码保存到数据库之前清理它并用相应的 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

这没有用

我也试过(这里推荐:在 Markdown 中使用 ERB 和 Redcarpet):

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

这也不起作用。

我将如何解决任何一种方式?

标签: rubyencodingutf-8markdown

解决方案


最后我通过添加force_encoding("UFT-8")到 html解决了这个问题

像这样:

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

它修复了它。


推荐阅读