使用Nokogiri替换时的编码问题

时间:2013-02-28 21:20:00

标签: ruby encoding character-encoding nokogiri

我有这段代码:

# 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。

2 个答案:

答案 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”也可能有用。