gsub :: ArgumentError (UTF-8 中的无效字节序列)

3
这段代码使用 Hpricot gem 来获取包含 UTF-8 字符的 HTML。
# <div>This is a test<a href="">测试</a></div>
div[0].to_html.gsub(/test/, "")

当运行时,它会输出这个错误(指向gsub):
ArgumentError (invalid byte sequence in UTF-8)

我们该如何解决这个问题?

你确定源代码是UTF-8格式的吗?实际字节长什么样子? - Wooble
1
是的,否则它就不会说“UTF-8”。这是它实际检查的内容:test...<a href="..." target="_top"><span style="font-weight: bold;">Café</a> testing - Artem Kalinchuk
.to_html.gsub使用您指定的值,它有效。能否给我们更多细节? - louiscoquio
@ArtemKalinchuk:错误信息表明您传递的内容实际上不是有效的UTF-8编码。这可能意味着字符采用了其他编码方式。 - Wooble
@wooble 是的,我知道。我的问题是如何使它有效? - Artem Kalinchuk
显示剩余2条评论
2个回答

3

找到了问题所在。Hpricot的to_html调用的方法会触发错误,所以为了消除这个问题,我们需要将Hpricot文档的编码设置为UTF-8,而不仅仅是一个字符串。我们可以这样做:

ic = Iconv.new("UTF-8//IGNORE", "UTF-8")
doc = open("http://example.com") {|f| Hpricot(ic.iconv(f.read)) }

然后我们可以调用其他Hpricot方法,但现在整个文档都采用UTF-8编码,不会出现任何错误。


这个可以正常工作,但自 Ruby 1.9.3 起已被弃用。您能否通过字符串内置编码提供解决方案? - Bogdan Gusiev
https://dev59.com/EGoy5IYBdhLWcg3wMLSj - lulalala
也许这可以帮助你:http://stackoverflow.com/questions/11016328/hpricot-utf-8-issues - Artem Kalinchuk

0

to_html在此情况下似乎返回非utf8字符串。

我曾经遇到过包含一些非utf8字符的文件的同样问题。我找到的解决方法并不是很完美,但它也可能适用于您的情况:

the_utf8_string = the_non_utf8_string.unpack('C*').pack('U*')

小心,我不确定是否有任何数据丢失。


我在其他地方看到的unpack+pack是用于“拉丁化”(移除撇号等),这意味着数据会丢失。如果上面的解决方案相同,那么它在这里就无用了。 - Simon B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接