我有这样的代码:
# 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混淆重音"可能也有用。