我使用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代码替换任何特殊字符(例如£
变成£
)
我试着有一个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.