на дисплее в кодировке iso-8859-1 отображаются странные символы - PullRequest
1 голос
/ 11 декабря 2010

У меня есть csv-файл в кодировке ISO-8859-1, который я пытаюсь открыть и проанализировать с помощью ruby:

require 'csv'

filename = File.expand_path('~/myfile.csv')
file = File.open(filename, "r:ISO-8859-1")
CSV.parse(file.read, col_sep: "\t") do |row| 
  puts row 
end

Если я пропускаю кодировку из вызова File.open, я получаю ошибку

ArgumentError: неверная последовательность байтов в UTF-8

Моя проблема в том, что при вызове puts row вместо норвежских символов отображаются странные символы æ, ø, å:

BOKFRINGSDATO

Я получаю то же самое, если открываю файл в textmate, заставляя его использовать кодировку UTF-8.

Назначая содержимое файла строке, я могу проверить кодировку, используемую для строки. Как и ожидалось, он показывает ISO-8859-1.

Итак, когда я puts каждой строке, почему она выводит строку как UTF-8? Это как-то связано с csv-библиотекой?

Я использую ruby ​​1.9.2.

Ответы [ 3 ]

4 голосов
/ 12 декабря 2010

Я нашел ответ, попробовав разные вещи из документации:

require 'csv'

filename = File.expand_path('~/myfile.csv')
File.open(filename, "r:ISO-8859-1") do |file|
  CSV.parse(file.read.encode("UTF-8"), col_sep: "\t") do |row| 
    #                    ↳  returns a copy transcoded to UTF-8.
    puts row 
  end
end

Как вы можете видеть, все, что я сделал, это закодировал строку в строку UTF-8 перед CSV-парсеромполучает его.


Редактировать:
При использовании этого решения на macruby-head, я получаю следующее сообщение об ошибке от encode ():

Encoding :: InvalidByteSequenceError: "\ xD8" в UTF-8

Несмотря на то, что я указываю кодировку при открытии файла, макруби используют UTF-8.Кажется, это известное ограничение макруби: Кодировка всегда UTF-8

1 голос
/ 11 декабря 2010

Может быть, вы могли бы использовать Iconv для преобразования содержимого файла в UTF-8 перед анализом?

0 голосов
/ 11 декабря 2010

ISO-8859-1 и Win-1252 действительно близки в своих наборах символов. Может ли какое-то приложение обработать файл и преобразовать его? Или это могло быть получено с машины, которая по умолчанию использовала Win-1252, которая является стандартной настройкой Windows?

Программное обеспечение, которое распознает набор кодов, может получить неправильную кодировку, если в диапазоне байтов от 0x80 до 0x9F нет символов, поэтому вы можете попробовать установить file = File.open(filename, "r:ISO-8859-1") в file = File.open(filename, "r:Windows-1252"). (Я думаю, что «Windows-1252» - правильное название кодировки.)

Раньше я писал пауков, а HTML печально известен тем, что его неправильно маркируют или кодируют двоичные символы из одного набора символов, встроенного в другой. Я много раз использовал плохой язык для решения этих проблем несколько лет назад, до того, как большинство языков реализовали UTF-8 и Unicode, поэтому я понимаю разочарование.

ISO / IEC_8859-1 , Windows-1252

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...