2016-03-18 4 views
3

Я пытаюсь прочитать файл .txt в рубине и разбивать текст по строкам.`scan ': неверная последовательность байтов в UTF-8 (ArgumentError)

Вот мой код:

def file_read(filename) 
    File.open(filename, 'r').read 
end 

puts f = file_read('alice_in_wonderland.txt') 

Этот работает отлично. Но когда я добавляю метод line_cutter так:

def file_read(filename) 
    File.open(filename, 'r').read 
end 

def line_cutter(file) 
    file.scan(/\w/) 
end 

puts f = line_cutter(file_read('alice_in_wonderland.txt')) 

Я получаю сообщение об ошибке:

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

Я нашел this онлайн для ненадежного веб-сайт и пытался использовать его для своего собственного кода, но это не работает. Как удалить эту ошибку?

Ссылка на файл: File

+0

@sawa К сожалению, я хотел бы знать, как удалить эта ошибка. – anonn023432

+1

Связанная статья была написана в 2006 году, вы не используете Ruby 1.8, не так ли? – Stefan

+0

@Stefan no Я использую 2.2.1. Спасибо – anonn023432

ответ

4

Связанный текстовый файл содержит следующую строку:

Character set encoding: ISO-8859-1

При преобразовании это не желательно или возможно, то вы должны сказать рубин, что этот файл ISO-8859-1 закодирован. В противном случае используется default external encoding (UTF-8 в вашем случае). Возможный способ сделать это:

s = File.read('alice_in_wonderland.txt', encoding: 'ISO-8859-1') 
s.encoding # => #<Encoding:ISO-8859-1> 

Или даже так, если вы предпочитаете, чтобы строка UTF-8 кодируются (см utf8everywhere.org):

s = File.read('alice_in_wonderland.txt', encoding: 'ISO-8859-1:UTF-8') 
s.encoding # => #<Encoding:UTF-8> 
2

Это похоже на работу, если вы читаете файл непосредственно со страницы, может быть, есть что-то забавное в локальной копии у вас есть. Попробуйте это:

require 'net/http' 

uri = 'http://www.ccs.neu.edu/home/vip/teach/Algorithms/7_hash_RBtree_simpleDS/hw_hash_RBtree/alice_in_wonderland.txt' 
scanned = Net::HTTP.get_response(URI.parse(uri)).body.scan(/\w/)