Проблемы с кодировкой ленты Ruby 1.9

Я пытаюсь анализировать rss/atom-каналы в своем приложении rails, но столкнулся с некоторыми серьезными проблемами с символами, отличными от ASCII, например. немецкие умлауты ÄÖÜ или ß. Некоторые каналы в дикой природе используют правильную UTF-8, но некоторые другие заставляют меня плакать. Общая проблема:

Я должен иметь возможность анализировать любые фиды, в какой бы кодировке они ни были. «Потеря» символов не является вариантом (хотя это мой текущий статус), потому что я выполняю некоторый текстовый и языковой анализ с элементами ленты.

Что я использую до сих пор:

  • FeedZirra для получения и анализа каналов пока работает хорошо. Я также "дезинфицирую" значения, которые я получаю от FeedZirra.
  • HTMLEntities (драгоценный камень) для отмены экранирования специальных символов, таких как "Ä", что означает "Ä"
  • rCharDet19, чтобы выяснить, какая кодировка может быть у фида, и чтобы:
  • строка.кодировать! конвертировать из чего бы то ни было в utf-8
  • Ruby 1.9.3 (последняя версия) и Rails 3.2.8 на Ubuntu Linux 12.04

Проблема в том, что я буквально понятия не имею, что я делаю неправильно.

  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, поэтому каждый файл в моем проекте должен иметь комментарий в первой строке. Моя база данных sqlite3 с utf-8.

По состоянию на 2012 год, есть ли что-нибудь, на что я должен обратить внимание? Я сделал что-то действительно неправильно?

Спасибо за помощь!

EDIT: Фиды могут быть RSS любого типа, атомами и/или просто недействительным XML. Кодировка может быть UTF-8, чем-то другим или просто говорить «utf-8», в то время как это какие-то вещи Windows-XXX и так далее. Мне действительно нужно решение для всего этого.

Кроме того, выборка/парсинг должны быть максимально быстрыми, поэтому я выбрал Feedzirra.

Моя текущая идея состоит в том, чтобы получить фидконтент, заменить каждый символ в узлах «заголовок» и «описание» на htmlentities, если это возможно, использовать кодировку! чтобы переключиться на utf-8, а затем отменить экранирование htmlentities. После этого, я думаю, следует сохранить специальные символы, но в данный момент я не могу заставить что-то подобное работать. Может быть, это хороший подход?


person Maximilian Stroh    schedule 29.08.2012    source источник


Ответы (1)


Наконец я нашел основную проблему:

Feedzirra уже возвращает UTF-8 при доступе к записям и их атрибутам. Но я использовал метод очистки для доступа к атрибутам, который возвращает ASCII-8BIT и странные символы, экранированные как html-сущности.

Тем не менее, я выкинул из своего кода всю очистку и кодирование, и теперь он просто работает. Кажется, что FeedZirra имеет что-то встроенное для перекодирования каналов, если это необходимо.

person Maximilian Stroh    schedule 30.08.2012