如何安全地解析Ruby / Rails中的多字节提要?

时间:2009-07-09 03:38:36

标签: ruby-on-rails utf-8 multibyte

(对不起,如果有一个新问题......我做了很多研究,说实话......)

我正在编写一些Ruby on Rails代码来解析RSS / ATOM提要。我的代码是用一个讨厌的'£'符号。

在做其他任何事情之前,我一直在尝试规范化Feed的描述和标题字段:

descr = self.description.mb_chars.normalize(:kc)

然而,当它用“£”命中字符串时,我猜测mb_chars会遇到问题并返回一个常规的Ruby String对象。我收到错误:

undefined method `normalize' for #<String:0x5ef8490>

那么,防御性地准备这些字符串以插入数据库的最佳过程是什么? (我还需要对它们进行一堆字符串处理)

我的问题更加复杂,因为我不知道我正在处理的Feed的格式。例如,我在以下几行中运气不错:

descr = Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv descr

然而,当遇到'£'时,它只会截断那一点之后的所有内容。

当我使用String.inspect函数显示'£'符号时,它显示在'\ 243'。如果一个方法没有“正确”处理这个符号,我会很高兴用它代替另一个值(比如'GBP')。因此,对该代码的帮助也将受到赞赏。

相关Feed是http://www.dailymail.co.uk/sport/football/index.rss

2 个答案:

答案 0 :(得分:3)

我找到了一个解决方案:

  

要修复它,我必须为文档定义$ KCODE(编码):

require 'rubygems'
require 'active_support/all'

$KCODE = 'UTF8'

str = "test ščž"
puts str.parameterize.inspect
puts str.parameterize.to_s

=&GT; # =&GT;测试SCZ

原帖:https://rails.lighthouseapp.com/projects/8994/tickets/3504-string-parameterize-normalize-bug

答案 1 :(得分:1)

我遗漏了一些非常基本的东西 - 我猜测正在进入的Feed的编码。

所以现在我正在查看(a)HTTP响应头中的字符集,然后(b)源本身的XML声明中的编码。

一旦我进行了编码,我就使用iconv将其移动到UTF-8。

到目前为止一切顺利。