我有这段代码:
# 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。
答案 0 :(得分:5)
似乎如果你传递了一个nokogiri文本对象就可以做到这一点;)
links.first.replace Nokogiri::XML::Text.new(only_text, @doc)
答案 1 :(得分:0)
我无法复制问题,但我有两件不同的事情要尝试:
而不是使用:
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”也可能有用。