6

我有这个代码:

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

4

2 回答 2

5

似乎如果你传递一个 nokogiri 文本对象,它就会这样做;)

links.first.replace Nokogiri::XML::Text.new(only_text, @doc)
于 2013-03-01T01:49:24.753 回答
0

我无法复制这个问题,但我有两个不同的尝试:

而不是使用:

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 弄乱口音”可能也很有用。

于 2013-03-01T02:26:50.357 回答