2012-06-16 26 views
21

tôi đang cố gắng để cư đối tượng phim, nhưng khi phân tích cú pháp thông qua các tập tin u.item tôi nhận được lỗi này:của Ruby 'chia': không hợp lệ byte chuỗi trong 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 

Các lỗi xảy ra chỉ khi cố gắng chia các dòng với dấu chấm câu quốc tế ưa thích.

Đây là một mẫu

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

Có một công việc xung quanh ??

+1

gì 'od -c' nói về dòng trong câu hỏi? –

+0

Nó hoạt động cho tôi với kho văn bản như được đăng. @ IgnacioVazquez-Abrams có lẽ đúng: bạn cần sử dụng trình chỉnh sửa hex để xem liệu bạn có các ký tự ẩn trong tệp dữ liệu của mình hay không. –

Trả lời

11

Ruby có phần nhạy cảm với các vấn đề về mã hóa ký tự. Bạn có thể làm một số điều có thể giải quyết vấn đề của bạn. Ví dụ:

  1. Đặt nhận xét mã hóa ở đầu tệp nguồn của bạn.

    # encoding: utf-8 
    
  2. Rõ ràng mã hóa dòng của bạn trước khi tách.

    line = line.encode('UTF-8').split("|") 
    
  3. Thay thế các ký tự không hợp lệ, thay vì tăng Encoding :: InvalidByteSequenceError exception.

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

Đưa ra những gợi ý một shot, và cập nhật câu hỏi của bạn nếu không ai trong số họ làm việc cho bạn. Hy vọng nó giúp!

+3

Không, không làm việc. Đã thử cả hai giải pháp .... bất kỳ ý tưởng nào khác .. – user1452307

+1

Lỗi mà anh ta nhận được ngụ ý rằng mã hóa đã là UTF-8. –

+0

Vì vậy, tôi đã kiểm tra từng dòng trước khi chương trình tìm cách chia nhỏ nó. Nó chỉ ra rằng lỗi xảy ra trong dòng với dấu chấm câu ưa thích Đây là kỷ lục xảy ra lỗi: 543 | Misérables, Les (1995) | 01-Jan-1995 || http: //us.imdb .com/M/tiêu đề chính xác? 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 Tôi đã thử tùy chọn thứ ba, không hoạt động ... Bất kỳ ý tưởng nào? hoặc các cách khác ... – user1452307

19

tôi phải buộc các mã hóa của mỗi dòng để iso-8859-1 (đó là bộ ký tự châu Âu) ... 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

Bạn có thể chỉ định mã hóa Ruby nên sử dụng khi sử dụng 'mở', ví dụ: 'File.open 'data.txt', 'r: iso-8859-1' do ...'. Xem [tài liệu] (http://ruby-doc.org/core-1.9.3/IO.html#method-c-new). – matt

Các vấn đề liên quan