Как безопасно анализировать многобайтовые каналы в Ruby/Rails?

StackOverflow https://stackoverflow.com/questions/1101724

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top