[Ruby] string.index("Umlaut-öäü")

te one

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.252
Nabend,

ich öffne per Mechanize (Ruby 193) eine Webseite um lediglich eine Zahl auszulesen. Da diese zahl nicht durch ein bestimmtes Muster von HTML-Tags zu finden ist, muss ich sie anhand der Position im Text finden (der Text davor ist immer der gleiche).

Die Lösung schien erstmal simpel:
Code:
require 'mechanize'
agent = mechanize.new
page = agent.get('http://blabla.de')
puts page.content.index('gesuchter String')
Funktioniert für normale Strings einwandfrei. Sind Umlaute im Suchstring, wirft er leider einen Fehler...

Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and CP850

page.content.encoding ergibt ASCII-8BIT
suchstring.encoding ergibt CP850
Wollte dann per suchstring.encode('ASCII-8BIT') diesen umwandeln, was mir aber ein
Encoding::UndefinedConversionError: U+00D6 to ASCII-8BIT in conversion from CP850 to UTF-8 to ASCII-8BIT
liefert....

Gibt es eine schönere Variante an diese Zahl zu kommen?
Unabhängig davon, wie bekomme ich das mit dem Index gebacken? Müsste meinen String wohl schon in ASCII-8BIT erstellen. Denke den page.content umzuwandeln ist zu gefährlich, da sich dann evtl die Position der Zahl im String unterscheidet.

Danke schonmal :)

Gruß
 
Es ist in allen Sprachen grundsätzlich angeraten, durchgängig auf UTF-8 zu setzen. Gerade wenn du Webseiten ausliest ist es fast garantiert, dass sie in UTF-8 geliefert werden. Veraltete ISO-Codierungen verwendet kaum jemand mehr.
 
Ich sollte wohl hinzufügen dass ich absoluter Neuling in Ruby bin. Was bedeutet diese Aussage für mich also? (Codeschnipsel?)
 
Tja, dann beherrschst du immer noch mehr Ruby als ich. Ich hatte aber in verschiedenen anderen Sprachen schon Probleme mit Nicht-UTF8 - Inhalten. Daher auch die Aussage: Konsequent auf UTF-8 setzen hilft.

Was ich dir sagen kann: UTF-8 ist eine Multibyte-Codierung. Zeichen aus dem ASCII-Raum belegen unter Umständen nur ein Byte, während außerhalb des ASCII-Raumes (also z.B. Umlaute) 2 Byte benötigen.
 
Aktuelle Lösung:

Ich wandle page.content und meinen suchstring in utf8 um, dann kann ich in diesem utf8 content auch den Test suchen. Anhand dessen suche ich mir dann alle nötigen Zahlen heraus :)
Danke für den groben Tipp. An diese Richtung dachte ich zwar schon, hätte aber gerne die Daten aus dem ursprünglichen Content gelesen. So geht aber auch :)
 
Guter Ansatz, nur eine kleine Warnung. Von PHP her kenn ich es so, dass man immer erst prüfen sollte, ob es nicht schon UTF-8 ist, bevor man herum konvertiert. Sonst kommt unter Umständen echte Soße dabei heraus. Kann natürlich auch sein, dass das in Ruby entfällt. PHP ist je eh etwas seltsam hinsichtlich UTF-8 mit seinen separaten Multibyte-String-Funktionen.
 
Zurück
Oben