Ruby `encode ': "\xC3" от ASCII-8BIT до UTF-8 (Encoding:: UndefinedConversionError)

Ганнибальные эпизоды в tvdb имеют в них странные символы.

Например:

Œuf

Итак, рубин выплевывает:

./manifesto.rb:19:in `encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
    from ./manifesto.rb:19:in `to_json'
    from ./manifesto.rb:19:in `<main>'

Строка 19:

puts @tree.to_json

Есть ли способ справиться с этими не-utf-символами? Я бы предпочел их не заменить, а преобразовать? Или игнорировать их? Я не знаю, любая помощь была оценена.

Странная часть состоит в том, что script отлично работает через cron. При ручном запуске создается ошибка.

Ответ 1

Кажется, вы должны использовать другую кодировку для объекта. Вы должны установить правильную кодовую страницу для переменной @tree, например, используя , используя @tree.force_encoding('ISO-8859-1'). Поскольку ASCII-8BIT используется только для двоичных файлов.

Чтобы найти текущую внешнюю кодировку для ruby, выполните:

Encoding.default_external

Если решает проблему, проблема заключалась в кодировке по умолчанию (кодировке), поэтому для ее устранения вам необходимо установить правильную кодовую страницу (кодировку) по умолчанию: либо

  • В ruby ​​изменить кодировку на или другой правильный, выполните следующие действия:

    Encoding.default_external = Encoding::UTF_8
    
  • В , grep действующая действующая установка:

    $ sudo env|grep UTF-8
    LC_ALL=ru_RU.UTF-8
    LANG=ru_RU.UTF-8
    

    Затем установите их в .bashrc правильно, аналогично, но не точно с языком ru_RU, например:

    export LC_ALL=ru_RU.UTF-8
    export LANG=ru_RU.UTF-8
    

Ответ 2

Файл .open(yml_file, 'w') должен быть изменен на File.open(yml_file, 'w b)

Ответ 3

Я просто пережил через несколько часов, пытаясь исправить аналогичную проблему. Я проверил свои локали, кодировку базы данных, все, что мог придумать, и все еще получал из базы данных ASCII-8BIT.

Хорошо, оказывается, что если вы храните текст в двоичном поле, он будет автоматически возвращен как кодированный текст ASCII-8BIT, что имеет смысл, однако это может (очевидно) вызвать проблемы в вашем приложении.

Он может быть исправлен путем изменения кодировки столбца на :text в ваших миграциях.