Я использую Nokogiri, и открытый uri для захвата содержания заголовка наклеивают веб-страницу, но испытываю затруднения из-за символов с диакритикой. Что лучший способ состоит в том, чтобы иметь дело с ними? Вот то, что я делаю:
require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open(link))
title = doc.at_css("title")
На данном этапе заголовок похож на это:
Rag\303\271
Вместо:
Ragù
Как у меня может быть возврат nokogiri надлежащий символ (например, ù в этом случае)?
Вот URL в качестве примера:
http://www.epicurious.com/recipes/food/views/Tagliatelle-with-Duck-Ragu-242037
Когда вы говорите «выглядит вот так», просматриваете ли вы это значение IRB? Он будет экранировать символы диапазона, отличные от ASCII, с помощью экранирования в стиле C байтовых последовательностей, представляющих символы.
Если вы напечатаете их с помощью put, вы получите их обратно, как вы ожидали, предполагая, что ваша консоль оболочки использует ту же кодировку, что и рассматриваемая строка (в данном случае, по-видимому, UTF-8, на основе двух байтов, возвращенных для этот персонаж). Если вы сохраняете значения в текстовом файле, печать на дескриптор также должна приводить к последовательностям UTF-8.
Если вам нужно выполнить перевод между UTF-8 и другими кодировками, особенности зависят от того, используете ли вы Ruby 1.9 или 1.8.6.
Для 1.9: http://blog.grayproductions.net/articles/ruby_19s_string для 1.8, вам, вероятно, потребуется взглянуть на Iconv.
Кроме того, если вам нужно взаимодействовать с COM-компонентами в Windows, вам нужно указать ruby, чтобы он использовал правильную кодировку, примерно следующим образом:
require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8
Если вы взаимодействуете с mysql, вам необходимо установите параметры сортировки в таблице так, чтобы они поддерживали кодировку, с которой вы работаете. В общем, лучше установить сопоставление в UTF-8, даже если часть вашего контента возвращается в других кодировках; вам просто нужно преобразовать по мере необходимости.
В Nokogiri есть некоторые функции для работы с разными кодировками (возможно, через Iconv), но я немного не практиковался в этом, поэтому я оставлю объяснение кому-нибудь другому.
Просто чтобы добавить перекрестную ссылку, эта страница SO дает некоторую связанную информацию:
Вам необходимо преобразовать ответ с обрабатываемого веб-сайта (здесь epicurious.com) в кодировку utf-8.
согласно html-содержимому извлекаемой страницы, на данный момент это "ISO-8859-1". Итак, вам нужно сделать что-то вроде этого:
require 'iconv'
doc = Nokogiri::HTML(Iconv.conv('utf-8//IGNORE', 'ISO-8859-1', open(link).read))
Подробнее об этом здесь: http://www.quarkruby.com/2009/9/22/rails-utf-8-and-html-screen- scraping
Попробуйте установить параметр кодировки для Nokogiri, например:
require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open(link))
doc.encoding = 'utf-8'
title = doc.at_css("title")