2012-06-16 16 views
21

Estoy tratando de poblar el objeto de película, pero al analizar a través del archivo u.item consigo este error:Rubí `dividida ': secuencia de bytes no válida en UTF-8 (ArgumentError)

`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 

El el error ocurre solo cuando se trata de dividir las líneas con una puntuación internacional sofisticada.

Aquí hay una muestra

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

es un trabajo en torno ??

+1

¿Qué 'desde -c' decir de la línea en ¿pregunta? –

+0

Funciona para mí con el corpus publicado. @ IgnacioVazquez-Abrams probablemente tiene razón: necesita usar un editor hexadecimal para ver si tiene caracteres ocultos en su archivo de datos. –

Respuesta

11

Ruby es algo sensible a los problemas de codificación de caracteres. Puedes hacer una serie de cosas que pueden resolver tu problema. Por ejemplo:

  1. Ponga un comentario de codificación en la parte superior de su archivo de origen.

    # encoding: utf-8 
    
  2. Codifique explícitamente su línea antes de partir.

    line = line.encode('UTF-8').split("|") 
    
  3. reemplazar los caracteres no válidos, en lugar de lanzar una excepción Codificación :: InvalidByteSequenceError.

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

dar a estas sugerencias un tiro, y actualizar su pregunta si ninguno de ellos trabajan para usted. ¡Espero eso ayude!

+3

No, no funcionó. Intenté ambas soluciones ... cualquier otra idea ... – user1452307

+1

El error que está recibiendo implica que la codificación ya es UTF-8. –

+0

Entonces, inspeccioné cada línea antes de que el programa intente dividirla. Resulta que el error se produce en las líneas con los signos de puntuación de fantasía Aquí está el registro donde se produjo el error: 543 | Misérables, Les (1995) | 01-Ene-1995 || http: //us.imdb .com/M/title-exact? Mis% E9rables% 2C% 20Les% 20% 281995% 29 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 Probé la tercera opción también, no funcionó ... ¿Alguna idea? o formas alternativas ... – user1452307

19

que tuvieron que forzar la codificación de cada línea de iso-8859-1 (que es el conjunto de caracteres de Europa) ... 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

Puede especificar qué codificación debe usar Ruby cuando usa 'open', por ejemplo 'File.open 'data.txt', 'r: iso-8859-1' do ...'. Ver [los documentos] (http://ruby-doc.org/core-1.9.3/IO.html#method-c-new). – matt

Cuestiones relacionadas