Почему Ruby не может конвертировать CP-1252 в UTF-8?

У меня есть файлы CSV, сохраненные из Excel, который является CP-1252/Windows-1252. Я попробовал следующее, но все равно получилось поврежденным. Зачем?

csv_text = File.read(arg[:file], encoding: 'cp1252').encode('utf-8')
# csv_text = File.read(arg[:file], encoding: 'cp1252')
csv = CSV.parse csv_text, :headers => true
  csv.each do |row|
    # create model
    p model

Результат

>rake import:csv["../file.csv"] | grep Brien
... name: "Oâ?TBrien ...

Однако это работает в консоли

> "O\x92Brien".force_encoding("cp1252").encode("utf-8")
=> "O'Brien"

Я могу открыть файл CSV в Notepad++, Encoding > Character Sets > Western European > Windows-1252посмотрите правильные символы, тогда Encoding > Convert to UTF-8, Тем не менее, есть много файлов, и я хочу, чтобы Ruby справился с этим.

Аналогично: Как изменить кодировку при разборе CSV в Rails. Но это не объясняет, почему это не удается.

Ruby 2.4, ссылка: https://ruby-doc.org/core-2.4.3/IO.html

1 ответ

Вау, это было вызвано дерьмом grep в DevKit.

>rake import:csv["../file.csv"]
... name: "O'Brien ...

>where grep
C:\DevKit2\bin\grep.exe

Мне тоже не нужно .encode('utf-8'),

Пусть это будет уроком детям. Никогда не принимаю ничего само собой разумеющимся. Не доверяй никому!

Другие вопросы по тегам