1

У меня есть приложение rails3, работающее на ruby ​​1.9 здесь, и у меня есть некоторые боли, делающие кодировки.Hpricot encodings in ruby ​​1.9

Моя задача состояла в том, чтобы открыть удаленную страницу html и проанализировать с нее некоторую информацию. все мои коды и базы данных находятся в UTF-8, im используя код # UTF-8, mysql и т. Д.

Страница, которую я открываю, находится в кодировке ISO-8859-1, и когда мой синтаксический анализатор набирает персонажей, он жалуется на недействительный UTF-8.

Я попытался использовать .force_encoding («UTF-8») во всех строках, которые я проанализировал, но это все еще. Когда я пытаюсь преобразовать всю страницу, я получаю это:

a = open("someurl") 
b = a.read.encode("UTF-8") 
Encoding::UndefinedConversionError: "\xE9" from ASCII-8BIT to UTF-8 
    from (irb):7:in `encode' 
    from (irb):7 
    from /Users/tscolari/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/commands/console.rb:44:in `start' 
    from /Users/tscolari/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/commands/console.rb:8:in `start' 
    from /Users/tscolari/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

как я могу это исправить? кажется, что это уже пошло не так, когда он «превратил» страницу iso8859 в ascii.

UPDATE

I судимое открытие URL, используя 'г: ISO-8859-1: UTF-8', но, видимо, моя проблема сейчас с Hpricot, который я использую для синтаксического анализа.

>a = open(b, 'r:iso-8859-1:utf-8') 
>a.read.encoding 
=> #<Encoding:UTF-8> 
> Hpricot(a).inner_html.encoding 
=> #<Encoding:ASCII-8BIT> 

и все ошибки снова ... наверное, это вопрос Hpricot, но если кто-нибудь знает, исправить, пожалуйста.

+0

Работает ли лучше, если вы используете nokogiri вместо hpricot? – dkarp

+0

ну, вы можете преобразовать inner_html в UTF-8 с помощью force_encoding, но если вы попытаетесь использовать inner_text, force_encoding даст вам ошибку. Работа вокруг заключается в использовании inner_html или inner_content вместо inner_text – Tiago

+0

. Я дам nokogiri попробовать здесь! благодаря! – Tiago

ответ

1

Hpricot - UTF-8 вопросов неверная последовательность байт в кодировке UTF-8 (ArgumentError)

require 'hpricot' 
require 'open-uri' 

doc = open('http://www.amazon.co.jp/') { |f| Hpricot(f.read) } 

puts doc.to_html 

open('http://www.amazon.co.jp/') { |f| Hpricot(f.read.encode("UTF-8")) }