【问题标题】:Encoding issue when using Nokogiri replace使用 Nokogiri 替换时的编码问题
【发布时间】:2013-02-15 06:03:58
【问题描述】:

我有这个代码:

# encoding: utf-8
require 'nokogiri'

s = "<a href='/path/to/file'>Café Verona</a>".encode('UTF-8')
puts "Original string: #{s}"

@doc = Nokogiri::HTML::DocumentFragment.parse(s)

links = @doc.css('a')
only_text = 'Café Verona'.encode('UTF-8')
puts "Replacement text: #{only_text}"
links.first.replace(only_text)
puts @doc.to_html

但是,输出是这样的:

Original string: <a href='/path/to/file'>Café Verona</a>
Replacement text: Café Verona
Café Verona

为什么@doc 中的文本编码错误?

我尝试使用和不使用encode('UTF-8') 或使用Document 而不是DocumentFragment,但这是同样的问题。

我正在使用 Nokogiri v1.5.6 和 Ruby 1.9.3p194。

【问题讨论】:

  • 我无法使用 Ruby 2.0.0 或 1.9.3 重现它。顺便问一下,你的 Ruby 版本是什么?
  • 你试过puts @doc.to_html(:encoding =&gt; "UTF-8")
  • @jonallard 这是 ruby​​ 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin11.4.0]
  • 我试过 @PinnyM 但不起作用

标签: ruby encoding character-encoding nokogiri


【解决方案1】:

似乎如果你传递一个 nokogiri 文本对象,它会做的事情;)

links.first.replace Nokogiri::XML::Text.new(only_text, @doc)

【讨论】:

  • 做到了!谢谢。我想知道为什么字符串直接不起作用。也许是一个错误?
  • 我严重怀疑这是一个错误。 100 次中有 99 次是用户错误。
  • 我不认识 nokogiri 的实习生。所以我不知道这是否是一个错误。但是你可以创建一个关于它的问题
【解决方案2】:

我无法重复这个问题,但我有两个不同的尝试:

而不是使用:

s = "<a href='/path/to/file'>Café Verona</a>".encode('UTF-8')

试试:

s = "<a href='/path/to/file'>Café Verona</a>"

由于您的声明 # encoding: utf-8,您的字符串已经是 UTF-8 编码的。这就是为什么你把它放在脚本中,告诉 Ruby 文字字符串是 UTF-8 格式的。您可能正在对其进行双重编码,尽管我认为 Ruby 不会 - 它应该默默地忽略第二次尝试,因为它已经是 UTF-8。

我想知道的另一件事是,输出如下:

Café Verona

表明您的系统和终端的语言/字符集编码不正确。尝试在设置为其他内容的系统上输出 UTF-8 字符串可能会导致终端和/或浏览器不匹配。 Windows 系统通常是 Win-1252、ISO-8859-1 或类似的,而不是 UTF-8。在我的 Mac OS 系统上,我设置了以下环境变量:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

Open iso-8859-1 encoded html with nokogiri messes up accents”也可能有用。

【讨论】:

  • 感谢您的回答。我在我的问题中提到,我在最后尝试了使用 & 不使用 encode() 。而且我认为我的终端很好,我也在 Mac 上,其他字符串看起来也很好(也是 UTF-8),所以这不应该是问题。无论如何,伊斯梅尔的回答解决了我的问题,但仍然想知道出了什么问题......
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 2021-07-04
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多