2013-05-07 12 views
9

Tôi đã cố tìm nạp số này CSV-File với Net::HTTP.Mã hóa :: UndefinedConversionError: " xE4" từ ASCII-8BIT sang UTF-8

File.open(file, "w:UTF-8") do |f| 
    content = Net::HTTP.get_response(URI.parse(url)).body 
    f.write(content) 
end 

Sau khi đọc tệp csv cục bộ của tôi một lần nữa, tôi có một số đầu ra lạ.

Nationalit\xE4t;Alter 0-5

Tôi cố gắng để mã hóa nó sang UTF-8, nhưng đã nhận lỗi Encoding::UndefinedConversionError: "\xE4" from ASCII-8BIT to UTF-8

Các rchardet đá quý tolds tôi nội dung là ISO-8859-2. Nhưng chuyển đổi thành UTF-8 sẽ không hoạt động.

Sau khi mở nó trong một Trình soạn thảo thông thường, tôi thấy nó được mã hóa bình thường.

Trả lời

18

Bạn có thể đi với force_encoding:

require 'net/http' 

url = "http://data.linz.gv.at/katalog/population/abstammung/2012/auslg_2012.csv" 
File.open('output', "w:UTF-8") do |f| 
    content = Net::HTTP.get_response(URI.parse(url)).body 
    f.write(content.force_encoding("UTF-8")) 
end 

Nhưng điều này sẽ làm cho bạn mất một số acentuation trong .cvs bạn nộp

Nếu bạn là chết chắc chắn rằng bạn sẽ luôn luôn sử dụng URL này như là đầu vào, và tệp sẽ luôn giữ mã hóa này, bạn có thể làm

# encoding: utf-8 
require 'net/http' 

url = "http://data.linz.gv.at/katalog/population/abstammung/2012/auslg_2012.csv" 
File.open('output', "w:UTF-8") do |f| 
    content = Net::HTTP.get_response(URI.parse(url)).body 
    f.write(content.encode("UTF-8", "ISO-8859-15")) 
end 

Nhưng điều này sẽ chỉ hoạt động với tệp này.

+0

Cảm ơn. Bạn đã tiết kiệm cho tôi giờ. – Mindbreaker