Кодировка:: UndefinedConversionError: "xE4 " от ASCII-8BIT до UTF-8

Я пытался достать это CSV-файл С Net::HTTP.

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

после чтения моего локального файла csv снова, я получил некоторые странные выходные данные.

NationalitxE4t; Alter 0-5

Я попытался закодировать его в UTF-8, но получил ошибку Encoding::UndefinedConversionError: "xE4" from ASCII-8BIT to UTF-8

на rchardet Гэм говорится Мне содержание ISO-8859-2. Но преобразовать в UTF-8 не будет работать.

после открытия его в обычном Texteditor, я вижу его нормальная кодировка.

1 ответов


вы можете пойти с 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

но это заставит вас потерять некоторую acentuation в вашем .файл cvs

Если вы смертельно уверены, что всегда будете использовать этот URL в качестве ввода, и файл всегда будет держать эту кодировку, вы можете сделать

# 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

но это будет работать только с этим файлом.