【问题标题】:`gsub': incompatible character encodings: UTF-8 and IBM437`gsub':不兼容的字符编码:UTF-8 和 IBM437
【发布时间】:2012-01-14 06:52:06
【问题描述】:

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

操作系统: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”时,我收到上面的错误。 有人可以帮忙吗?

【问题讨论】:

    标签: ruby parsing encoding utf-8


    【解决方案1】:

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

    source.encode!('UTF-8')
    

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

    【讨论】:

    • 谢谢,我尝试了您的解决方案,但出现新错误:encode!: "\xCA" from ASCII-8BIT to UTF-8 :/
    • 您可能不得不强制对源代码进行编码:source.force_encoding('IBM437').encode('UTF-8')?在任何情况下,\xCA 而不是您所拥有的 Ż,所以 IBM437 可能是错误的,应该用它实际上是什么来替换。
    • 感谢帮助,现在我尝试:source.force_encoding('IBM437').encode('iso-8859-2') 并且我遇到错误:encode: u+2569 to ISO-8859 -2 从 IBM437 转换为 UTF-8
    【解决方案2】:

    源变量的内部编码是 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)。

    【讨论】:

    • 感谢您的回复。我最后用 Java 做到了。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2011-05-26
    • 2011-12-14
    • 2016-04-27
    • 2012-07-13
    相关资源
    最近更新 更多