Как безопасно анализировать многобайтовые каналы в Ruby/Rails?
-
12-09-2019 - |
Вопрос
(Извините, если вопрос для новичков... Честно говоря, я провел немало исследований...)
Я пишу код 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
Мне не хватало чего-то довольно простого - я угадывал кодировку входящего канала.
Итак, теперь я смотрю на (а) кодировку в заголовках HTTP-ответа, затем (б) на кодировку в объявлении XML в самом фиде.
Получив кодировку, я использую iconv, чтобы переместить ее в UTF-8.
Все идет нормально.
Другие советы
Я нашел одно решение:
Чтобы это исправить, мне пришлось определить $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