ruby-on-rails - 被 nokogiri 在 ruby​​ on rails 中转换为 "\u0092"

标签 ruby-on-rails ruby nokogiri

我有一个 html 页面,其中包含一些 html 实体,例如“’”。

#Here I am not pasting whole html page content. just putting issue line only
html_file = "<html>....<body><p>they&#146;re originally intended to describe the spread of of viral diseases, but they&amp;#146;re nice analogies for how web/SN apps grow.<p> ...</body></html>"


doc   = Nokogiri::HTML(html)
body  = doc.xpath('//body')
body_content = body[0].inner_html

puts body_content  

结果:

These terms come from the fields of medicine and biology  they\u0092re originally intended to describe the spread of of viral diseases, but they\u0092re nice analogies for how web/SN apps grow.

我想保留这些实体的原样,而不是将其更改为 unicode。 有什么,我错过了吗?

谢谢

最佳答案

they&#146;re

是错误的,应该避免。如果你想在那里使用闭单引号,重现将撇号呈现为斜引号的打印实践,那么正确的字符是 U+2019 右单引号,可以写成 ’ ;。或者,如果您使用的是 UTF-8,则只需逐字包含 '

应该引用字符 U+0092,这是一个很少使用且毫无意义的控制字符,通常呈现为空白或缺少字形框。在 XML 中确实如此。

但在 HTML 中(XHTML 除外,它使用 XML 规则),它是一个长期存在的浏览器怪癖,字符引用范围在 Ÿ 被误解为与 Windows 西方代码页 (cp1252) 中的字节 128 到 159 关联的字符,而不是具有这些代码点的 Unicode 字符。 HTML5 标准最终记录了这种行为。

问题是 Nokogiri 并不知道这个怪癖,并且照原样使用字符引用 146,以您并不真正想要的字符 146 (\u0092) 结尾。我认为 Nokogiri 正在使用 libxml2 来解析 HTML,因此最终正确的解决方法是使用 libxml2 的 htmlParseCharRef 函数来替换字符 128–159。

与此同时,您或许可以尝试在解析之前使用粗略的字符串替换(如 ->)手动“修复”字符引用。这有点不对,但至少在 HTML 中,唯一可以使用标记序列 而不是字符引用的地方是在注释中,所以希望这无关紧要如果您不小心更改了那里的内容。

关于ruby-on-rails - 被 nokogiri 在 ruby​​ on rails 中转换为 "\u0092",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7031633/

相关文章:

ruby-on-rails - 从 Rails 检查域可用性

ruby-on-rails - 获取 PG :UndefinedTable: ERROR: when running migration to add friendships table (In development)

ruby-on-rails - Ruby/Rails Apache2 和 Passenger 设置返回目录列表

ruby - 如何从 Ruby 中的字符串获取第一行?

ruby - 使用周围元素引用数据

html - Rails - 使用 h() 转义 HTML 并排除特定标签

ruby - 乘客:无法加载此类文件 ruby​​gems/builder

ruby - 如何使用 Ruby 获取系统信息?

ruby-on-rails - Nokogiri:使用 XPath 搜索 <div>

arrays - 将抓取的链接存储在数组中,然后调用一个函数来抓取这些内容