使用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.

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

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

我不能重复这个问题,但我有两个不同的事情要尝试:

而不是使用:

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

试题:

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

您的字符串已经是UTF-8编码,因为您的语句# encoding: 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

"打开iso-8859-1编码的html与nokogiri混淆重音"可能也有用。

相关内容

  • 没有找到相关文章

最新更新