0

我正在尝试在我的 rails 应用程序中解析 rss/atom-feeds,但我遇到了一些非 ASCII 字符的严重问题,例如。德语变音符号 ÄÖÜ 或 ß。野外的一些提要使用正确的 UTF-8,但其他一些让我哭泣。一般问题是:

我必须能够解析任何提要,无论它们可能具有什么编码。字符的“丢失”不是一个选项(尽管它是我目前的状态),因为我对提要项目进行了一些文本和语言分析。

到目前为止我使用的是什么:

  • FeedZirra 用于获取和解析提要,目前运行良好。我还“清理”了从 FeedZirra 获得的值。
  • HTMLEntities (gem) 用于取消转义特殊字符,例如"Ä"表示“Ä”
  • rCharDet19 gem,以确定提要可能具有的编码,并:
  • 字符串.编码!从任何内容转换为 utf-8
  • Ubuntu Linux 12.04 上的 Ruby 1.9.3(最新)和 Rails 3.2.8

问题是,我真的不知道我做错了什么。

  def self.sanitize_encoding_and_htmlentities str
    cd = CharDet.detect str
    s = str.encode(:invalid => :replace, :undef => :replace, :replace => '')
    coder = HTMLEntities.new
    coder.decode(s)
  end

这是我目前的消毒方法。作为我使用的样本提要

http://www.N24.de/2/index.rss

到目前为止,“特殊”字符已被完全替换。这是我发现的唯一变体,它可以正常工作而不会因无效字节内容而引发错误。我稍微改变了编码方法,因为我在 ruby​​ 文档中读到,在没有给出任何编码的情况下,编码方法应该“转换”为应用程序的给定 default_internal 编码,在我的例子中是 utf-8。CharDet 站在那里只是为了对任何相关内容进行可能的更改,可能会有用。

我使用了magic_encoding gem,所以我项目中的每个文件都应该在第一行有注释。我的数据库是带有 utf-8 的 sqlite3。

截至2012年,有什么我应该看的吗?我真的做错了什么吗?

感谢帮助!

编辑: 提要可能是任何类型的 RSS、原子和/或只是无效的 XML。编码可能是 UTF-8,不同的东西,或者只是说“utf-8”,而它的一些 windows-XXX 的东西,等等。我真的需要一个解决方案。

此外,获取/解析必须尽可能快,这就是我选择 feedzirra 的原因。

我目前的想法是获取提要内容,如果可能的话,用 htmlentities 替换“标题”和“描述”节点中的每个字符,使用编码!方法切换到 utf-8,然后对 htmlentities 进行转义。在此之后,我认为应该保留特殊字符,但目前我无法得到这样的东西。这可能是一个好方法吗?

4

1 回答 1

0

最后我发现了主要问题:

Feedzirra 在访问条目及其属性时已经返回 UTF-8。但是我使用 sanitize 方法来访问属性,它返回 ASCII-8BIT 并且奇怪的字符转义为 html-entities。

然而,我从我的代码中剔除了所有的清理和编码的东西,现在它就可以工作了。如果需要,FeedZirra 似乎内置了一些东西来对提要进行转码。

于 2012-08-30T07:45:14.007 回答