ruby - 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 代码替换任何特殊字符(例如£
变成£
)
我尝试了一个 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 %>
这也不起作用。
我将如何解决任何一种方式?
解决方案
最后我通过添加force_encoding("UFT-8")
到 html解决了这个问题
像这样:
f.write html.force_encoding("UTF-8")
它修复了它。
推荐阅读
- html - Djnago 与内置 html 模板的集成
- java - 如何在没有 UI 事件 ITreeContentProvider 的情况下调用 getChildren()?
- flutter - 关于 ChangeNotifier 提供程序
- java - Java JVM 元空间分配很多但使用很少
- css - 如何将我的 animateMotion 与我的 CSS 动画同步?
- android - 使用 Arduino MFRC522 进行 Android NFC 卡仿真
- c++ - 如何在保持 UNIX 格式的同时将“ros::Time”转换为字符串?
- javascript - 在 AJAX 调用中获取图像而不是 url
- memory - 数据总线和内存单元寻址混乱
- python - 未找到 windows 10 python 串行模块,但 pip install pyserial 已通过