编码::未定义转换错误 从 ASCII-8BIT 到 UTF-8 的"xC2"



我使用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保存到文件时,在其他地方我正确地使用相同的markdown helper将文本呈现给浏览器,并且没有问题。

它也会以另一种方式工作,在将其保存到DB之前清理markdown代码,并使用相应的html代码替换任何特殊字符(例如£变成&#xA3;)

我试着有一个before_save回调(如建议在这里:Encoding:: undefinedconveronerror: "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 %>

也不能用

我该如何修复这两种方式?

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

解决了这个问题:

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

it fixed it.

最新更新