2013-02-28 27 views
6

我有这样的代码:编码问题时使用替换引入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。

+0

我无法使用Ruby 2.0.0或1.9.3来重现它。顺便说一句,你的Ruby版本是什么? – 2013-02-28 21:25:52

+0

你试过了'puts @ doc.to_html(:encoding =>“UTF-8”)' – PinnyM 2013-02-28 21:26:58

+0

@jonallard它是ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin11.4.0] – Cristian 2013-02-28 21:38:47

回答

5

看来,如果你传递一个引入nokogiri文本对象它做的事;)

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

这样做!谢谢。我不知道为什么字符串直接不起作用。也许是一个错误? – Cristian 2013-03-01 22:16:31

+0

我严重怀疑这是一个错误。 100次中有99次是用户错误。 – 2013-03-01 22:56:02

+0

我不知道nokogiri的实习生。所以我不知道这是否是一个错误。但你可以创建一个问题 – 2013-03-01 22:57:21

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”可能是有用的。

+0

感谢您的答案。我在我的问题中提到过,我在末尾使用&没有使用encode()。我认为我的终端是好的,我也在Mac上,其他的字符串显示正常(也是UTF-8),所以这不应该成为问题。无论如何,伊斯梅尔的答案解决了我的问题,但仍然在想什么是错的...... – Cristian 2013-03-01 22:18:28