2010-02-28 115 views
1

因此,我试图使用nokogiri做一些屏幕抓取a certain site,但网站所有者未能在<meta>标记中指定正确的页面编码。这样做的结果是我试图处理那些认为他们是utf-8的字符串,但实际上并非如此。ruby​​字符串编码

(如果你愿意,这里是我使用来测试这个文件:

做搜索周围的很多后(this SO question特别有用),我发现,在该测试字符串调用encode('iso-8859-1', 'utf-8')“作品”,因为我得到一个正确的©象征。现在的问题是,我想要的其他字符在转换为拉丁编码时不起作用(例如,Shōta,变成Sh�\x8Dta)。

现在,我可能会打扰适当的网站管理员,并尝试让他们修复他们该死的编码,但在此期间,我希望能够使用我得到的字节。我相当肯定,有一种方法,但我不能为我的生活弄清楚它是什么。

回答

1

所以,问题是人工神经网络只通过标题指定编码,并且Nokogiri没有收到来自open()函数的头文件。所以,Nokogiri猜测这个页面是拉丁编码的,并且产生了我们实际上无法反转的字符串来获取原始字符。

您可以指定Nokogiri的编码作为Nokogiri :: HTML()的第三个参数,它解决了我最初试图解决的问题。所以,即使我提出的更具体的问题(如何从拉丁字符串中获取非拉丁字符)无法回答,我也会接受这个答案。

1

这些页面似乎被正确编码为UTF-8。这就是我的浏览器看到它们的原因,当我将它们视为来源并告诉编辑将它们解码为UTF-8时,它们看起来很好。我看到的唯一问题是,某些版权符号在添加到内容之前(或之后)似乎已经损坏。 o-macron和其他非ASCII字母通过就好了。

我不知道你是否意识到这一点,但通知客户端页面编码的正确方法是通过标题。页可能<meta>标签中包含该信息,但这既不是必需的也不是预期的;如果标题存在,浏览器通常会忽略这些标记。

由于您的页面是XHTML,因此它们也可以将编码信息嵌入到XML处理指令中,但同样,它们不是必需的。但它也意味着你可以让Nokogiri把它们当作XML来代替HTML,在这种情况下,我希望它默认使用UTF-8。但是我对Nokogiri不熟悉,所以我不能确定。无论如何,头球依然是最后的权威。

+0

确实,Firefox报告说该页面是utf-8编码的,并且它看起来很好。问题是,当我将字符串拉出来时,它们似乎是一些奇怪的拉丁字母编码 - 但是包括unicode字符编码,这非常烦人,而且非常混乱。当使用文件的本地副本时,添加适当的标记解决了这个问题,但我不确定为什么这是服务器已经发送utf-8头文件的原因。 :/ – 2010-03-01 11:16:21