1

Ich habe eine Rails3-Anwendung auf Ruby 1.9 hier laufen, und ich habe einige Schmerzen machen Kodierungen arbeiten.Hprikot Kodierungen in Rubin 1.9

Meine Aufgabe war es, eine Remote-HTML-Seite zu öffnen und einige Informationen daraus zu analysieren. Alle meine Code und Datenbank sind in UTF-8, ich benutze die # Code: UTF-8, MySQL-Fix, und so weiter.

Die Seite, die ich öffne, ist in Zeichen ISO-8859-1, und wenn mein Parser storage Zeichen findet, beklagt es sein kein gültiges UTF-8.

Ich versuchte .force_encoding ("UTF-8") in allen Strings, die ich analysiert habe, aber es immer noch. Wenn ich versuche, die ganze Seite zu konvertieren, ich diese:

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>' 

wie könnte ich dieses Problem beheben? es scheint, dass es schon schief gelaufen ist, als er die iso8859-Seite in ascii "umgewandelt" hat.

UPDATE

tryed ich die URL öffnen mit 'r: iso-8859-1: utf-8', aber anscheinend jetzt mein Problem ist mit Hpricot, dass ich für die Analyse verwendet werden.

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

und alle Fehler wieder ... wahrscheinlich ist dies ein Problem hpricot, aber wenn jemand eine Lösung kennt, bitte.

+0

es besser Funktioniert, wenn Sie verwenden Nokogiri statt Hpricot? – dkarp

+0

Nun, Sie können die inner_html mit Force_encoding in UTF-8 konvertieren, aber wenn Sie versuchen, inner_text zu verwenden, gibt Ihnen force_encoding einen Fehler. Die Arbeit besteht darin, entweder inner_html oder inner_content anstelle von inner_text zu verwenden. – Tiago

+0

Ich werde nokogiri hier versuchen! Vielen Dank! – Tiago

Antwort

1

Hpricot - UTF-8 Ausgaben ungültige Bytefolge in UTF-8 (Argument)

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")) }