Как безопасно анализировать многобайтовые каналы в Ruby / Rails? - PullRequest
1 голос
/ 09 июля 2009

(Извините, если новый вопрос ... Я провел немало исследований, честно ...)

Я пишу код на Ruby on Rails для разбора RSS / ATOM каналов. Мой код помешан на надоедливом символе «£».

Я пытался нормализовать поля описания и заголовка каналов, прежде чем делать что-либо еще:

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

Однако, когда он попадает в строку с символом '£', я предполагаю, что mb_chars обнаруживает проблему и возвращает обычный объект Ruby String. Я получаю ошибку:

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

Так, как лучше всего подготовить эти строки для вставки в базу данных? (Мне нужно также выполнить кучу обработок строк на них)

Моя проблема усугубляется тем, что я не знаю формат фида, который я обрабатываю. Например, мне повезло со следующей строкой:

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

Однако, когда он встречает '£', он просто обрезает все после этой точки.

Когда я отображаю символ «£» с помощью функции String.inspect, он отображается как «\ 243». Если бы метод «правильно» не работал с этим символом, я был бы достаточно счастлив заменить его на другое значение (например, «GBP»). Так что помощь с этим кодом была бы признательна.

Фид в вопросе http://www.dailymail.co.uk/sport/football/index.rss

Ответы [ 2 ]

3 голосов
/ 02 октября 2010

Я нашел одно решение:

Чтобы исправить это, я должен был определить $ KCODE (кодировку) для документа:

require 'rubygems'
require 'active_support/all'

$KCODE = 'UTF8'

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

=> # => test-scz

Оригинальный пост: https://rails.lighthouseapp.com/projects/8994/tickets/3504-string-parameterize-normalize-bug

1 голос
/ 10 июля 2009

Я упустил что-то довольно простое - я догадывался о кодировке входящего канала.

Так что теперь я смотрю (а) кодировку в заголовках ответа HTTP, затем (б) кодировку в объявлении XML в самом фиде.

Получив кодировку, я использую iconv, чтобы переместить ее в UTF-8.

Пока все хорошо.

...