`gsub':不兼容的字符编码:UTF-8和IBM437

时间:2011-12-06 17:06:22

标签: ruby parsing encoding utf-8

我尝试使用搜索,谷歌但没有运气。

操作系统:Windows XP Ruby版本1.9.3po

错误:

`gsub':不兼容的字符编码:UTF-8和IBM437

代码:

require 'rubygems'
require 'hpricot'
require 'net/http'

source = Net::HTTP.get('host', '/' + ARGV[0] + '.asp')


doc = Hpricot(source) 

doc.search("p.MsoNormal/a").each do |a|
  puts a.to_plain_text
end

程序输出少量字符串,但当文本为“NOŻYCE”时,我收到错误。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

源变量的内部编码是UTF-8,但这不是你想要的。

正如tadman所写,你必须先告诉Ruby,字符串中的实际字符是IBM437编码。然后,您可以将该字符串转换为您喜欢的编码,但前提是可以进行此类转换。

source.force_encoding('IBM437').encode('UTF-8')

在您的情况下,您无法将字符串转换为ISO-8859-2,因为并非所有IBM437字符都可以转换为该字符集。坚持使用UTF-8可能是您的最佳选择。

无论如何,您确定该文件实际上是在IBM437中传输的吗?也许它存储在HTTP服务器中,但它是通过另一种编码通过线路发送的。或者甚至可能不完全在IBM437中,它可能是CP852,也称为MS-DOC Latin 2(与ISO Latin 2不同)。

答案 1 :(得分:2)

您可以尝试将HTML转换为UTF-8,因为它看起来是原始的复古DOS格式:

source.encode!('UTF-8')

应该按照Hpricot解析器的预期将它从8位ASCII转换为UTF-8。