Ruby `split': недопустимая последовательность байтов в UTF-8 (ArgumentError)

Я пытаюсь заполнить объект фильма, но при анализе файла u.item я получаю эту ошибку:

`split': недопустимая последовательность байтов в UTF-8 (ArgumentError)

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

Ошибка возникает только при попытке разделить строки причудливой международной пунктуацией.

Вот образец

543|Отверженные, Лес (1995)|01 января 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

Есть обходной путь??


person kashive    schedule 16.06.2012    source источник
comment
Что od -c говорит о рассматриваемой строке?   -  person Ignacio Vazquez-Abrams    schedule 16.06.2012
comment
Это работает для меня с корпусом, как опубликовано. @IgnacioVazquez-Abrams, вероятно, прав: вам нужно использовать шестнадцатеричный редактор, чтобы увидеть, есть ли в вашем файле данных скрытые символы.   -  person Todd A. Jacobs    schedule 16.06.2012


Ответы (2)


Мне пришлось принудительно закодировать каждую строку в iso-8859-1 (это европейский набор символов)... 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}
person kashive    schedule 17.06.2012
comment
Вы можете указать, какую кодировку Ruby должен использовать при использовании open, например. File.open 'data.txt', 'r:iso-8859-1' do .... См. документацию. - person matt; 17.06.2012

Ruby несколько чувствителен к проблемам с кодировкой символов. Вы можете сделать несколько вещей, которые могут решить вашу проблему. Например:

  1. Поместите комментарий к кодировке вверху исходного файла.

    # encoding: utf-8
    
  2. Явно закодируйте свою строку перед разделением.

    line = line.encode('UTF-8').split("|")
    
  3. Замените недопустимые символы вместо того, чтобы вызывать исключение Encoding::InvalidByteSequenceError.

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

Попробуйте эти предложения и обновите свой вопрос, если ни одно из них не работает для вас. Надеюсь, поможет!

person Todd A. Jacobs    schedule 16.06.2012
comment
Ошибка, которую он получает, подразумевает, что кодировка уже является UTF-8. - person Andrew Marshall; 16.06.2012
comment
Итак, я проверил каждую строку, прежде чем программа попытается ее разделить. Оказывается, ошибка возникает в строках с причудливыми знаками препинания Вот запись, в которой произошла ошибка: 543|Misérables, Les (1995)|01 января 1995||us.imdb.com/M/ Я пробовал и третий вариант, не получилось... Есть идеи? или альтернативные способы... - person kashive; 17.06.2012
comment
Похоже, это касается вашего крайнего случая: stackoverflow.com/a/10466273/1301972 - person Todd A. Jacobs; 17.06.2012
comment
Нашел рабочее решение по этому вопросу: stackoverflow.com/questions/7047944/ - person Shadoath; 30.11.2015