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

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

提问人:Don Giulio 提问时间:2/16/2021 更新时间:2/17/2021 访问量:1292

问:

我正在使用 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 帮助程序将文本呈现到浏览器,那里没有问题。

它也可以以另一种方式工作,在将 Markdown 代码保存到 DB 之前清理它,并将任何特殊字符替换为相应的 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 %>

这也行不通。

我将如何解决这两种方式?

Ruby 编码 UTF-8 Markdown

评论

0赞 Giacomo Catenazzi 2/16/2021
没有 ASCII-8BIT,所以我假设 Ruby 不知道如何将这样的字节转换为 Unicode(只是因为在任何 ASCII 中都没有这样的字节定义)。“£ 变成 &#xA3;* 我永远不会使用这样的转换。很久以前,我们使用了(有时,但经常是错误的)拉丁语-1。太不合时宜了,而且很旧。为什么不将所有堆栈都保留在Unicode中?&#x

答:

2赞 Don Giulio 2/17/2021 #1

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

喜欢这个:

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

它修好了。

评论

0赞 stevec 7/11/2023
救星!(谢谢!