2012-06-16 13 views
21

Ich versuche, den Film-Objekt zu füllen, aber wenn es durch die u.item Datei Parsen bekomme ich diesen Fehler:Rubin `split ': ungültige Bytefolge in UTF-8 (Argument)

`split': invalid byte sequence in UTF-8 (ArgumentError)

File.open("Data/u.item", "r") do |infile| 
      while line = infile.gets 
       line = line.split("|") 
      end 
end 

Die Fehler tritt nur auf, wenn versucht wird, die Zeilen mit internationaler Interpunktion zu trennen.

Hier ist eine Probe

543|Misérables, Les (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mis%E9rables%2C%20Les%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0

Gibt es eine Arbeit um ??

+1

Was od tut '-c' über die Linie sagen Frage? –

+0

Es funktioniert bei mir mit dem Korpus wie gepostet. @ IgnacioVazquez-Abrams ist wahrscheinlich richtig: Sie müssen einen Hex-Editor verwenden, um zu sehen, ob Sie versteckte Zeichen in Ihrer Datendatei haben. –

Antwort

11

Ruby reagiert empfindlich auf Zeichencodierungsprobleme. Sie können eine Reihe von Dingen ausführen, die Ihr Problem lösen könnten. Beispiel:

  1. Geben Sie einen Codierungskommentar am Anfang der Quelldatei ein.

    # encoding: utf-8 
    
  2. Explizit codieren Sie Ihre Zeile vor dem Aufteilen.

    line = line.encode('UTF-8').split("|") 
    
  3. ungültige Zeichen ersetzen, anstatt eine Encoding :: InvalidByteSequenceError Ausnahme zu erhöhen.

    line.encode('UTF-8', :invalid => :replace).split("|") 
    

diese Vorschläge einen Schuss, Geben und Ihre Frage aktualisieren, wenn keiner von ihnen für Sie arbeiten. Ich hoffe es hilft!

+3

Nein, hat nicht geklappt. Versuchte beide Lösungen .... andere Ideen .. – user1452307

+1

Der Fehler, den er bekommt, impliziert die Kodierung ist bereits UTF-8. –

+0

Also inspizierte ich jede Zeile, bevor das Programm versucht, es zu teilen. Es stellt sich heraus, dass der Fehler in den Zeilen mit ausgefallener Interpunktion auftritt Hier ist der Datensatz, in dem der Fehler aufgetreten ist: 543 | Misérables, Les (1995) | 01-Jan-1995 || http: //us.imdb .com/M/title-exact? Mis% E9rables% 2C% 20Les% 20% 281995% 29 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 Ich habe auch die dritte Option ausprobiert, habe nicht geklappt ... Irgendwelche Ideen? oder alternative Möglichkeiten ... – user1452307

19

Ich hatte die Codierung jeder Zeile zu iso-8859-1 zu zwingen (die den europäischen Zeichensatz) ... http://en.wikipedia.org/wiki/ISO/IEC_8859-1

a=[] 
IO.foreach("u.item") {|x| a << x} 
m=[] 
a.each_with_index {|line,i| x=line.force_encoding("iso-8859-1").split("|"); m[i]=x} 
+7

Sie können festlegen, welche Codierung Ruby verwenden sollte, wenn Sie 'öffnen', z 'File.open 'data.txt', 'r: iso-8859-1' tun ...'. Siehe [die Dokumente] (http://ruby-doc.org/core-1.9.3/IO.html#method-c-new). – matt

Verwandte Themen