我们正在使用Nokogiri根据用户输入创建HTML5页面,我们看到了一些奇怪的编码问题。
在我们的数据库表中,我们有一个名为compiled_html的属性,其中包含:
<p class="lead align-left">Just testing out some encoding issues:<br><br>Héllo Äre Thésè symbols showing correctly? </p>
从我们的数据库中提取这个HTML片段并创建一个新页面后,Nokogiri输出:
<p class="lead align-left">Just testing out some encoding issues:<br><br>Héllo Ãre Thésè symbols showing correctly? </p
这就是我们提取compiled_html数据并使用Nokogiri:的方式
page_doc = Nokogiri::HTML::fragment(page.compiled_html)
(旁注:在阅读后输出page_doc时,HTML是正确的)
# create page html
builder = Nokogiri::HTML::Builder.new(:encoding => 'UTF-8') do |doc|
doc.html {
doc.head {
doc.title page.name
doc.meta(charset: 'utf-8')
doc.meta(name: 'viewport', content: 'width=device-width, initial-scale=1.0')
doc.meta(name: 'description', content: '')
doc.meta(name: 'author', content: "#{issue.publication.user.firstname} #{issue.publication.user.lastname}")
doc.link(rel: 'stylesheet', href: "themes/#{theme.identifier}/theme.css")
doc.script(type: 'text/javascript', src: "themes/#{theme.identifier}/theme.js")
}
doc.body {
doc << page_doc
}
}
end
我们尝试过以不同的方式将编码设置为utf-8,但无论我们尝试什么,我们的输出中仍然会出现奇怪的符号。
这是一个RubyonRails 4应用程序。
有什么想法吗?谢谢
更新:如果我更改:
doc.body {
doc << page_doc
}
对此:
doc.body {
doc.text page_doc
}
然后字符编码是正确的,但所有的HTML都不正确,因为我得到了
<
而不是
<
等等。
好的,所以我们发现它实际上与Heroku和安装在那里的libxml版本有关,这就产生了问题:Nokogiri在Heroku 上解析时添加了字符
我出色的程序员想出了一个快速解决方案来解决我们的问题:
doc.body {
# doc << page_doc
}
# insert html contents
builder.doc.at_css('body').children = page_doc