Я пытаюсь анализировать 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. После этого, я думаю, следует сохранить специальные символы, но в данный момент я не могу заставить что-то подобное работать. Может быть, это хороший подход?