Ruby on Rails 3, несовместимые кодировки символов: UTF-8 и ASCII-8BIT с i18n

У меня есть проблемы с паролем Rails 3.0.1, Ruby 1.9.2 и локализацией моего сайта.

Проблема довольно проста, у меня есть что-то подобное в представлении:

f.input :zip_code, :label => I18n.t('labels.zip_code')

и файл es.yml:

es:
  labels:
    zip_code: "Este código postal no es valido."

Нет проблем с файлом en.yml(это чистый ASCII), но когда веб-сайт установлен с i18n.locale == 'es', я получаю эту ошибку:

incompatible character encodings: UTF-8 and ASCII-8BIT

Я довольно долго смотрел вокруг, но не нашел способ использовать мои файлы перевода UTF-8.

Кто-нибудь знает, как заставить его работать?

Спасибо за вашу помощь.

Ответ 1

Хорошо, поэтому проблема решена после нескольких часов работы в Интернете...

В моем коде было два ошибки. Первая из них была ошибкой кодирования файла, а вторая - проблемой конфигурации базы данных MySQL.

Во-первых, чтобы решить ошибку, вызванную MySQL, я использовал две статьи:

http://www.dotkam.com/2008/09/14/configure-rails-and-mysql-to-support-utf-8/

http://www.rorra.com.ar/2010/07/30/rails-3-mysql-and-utf-8/

Во-вторых, для решения проблемы с кодировкой файлов я добавил эти 2 строки в свой config/environment.rb

Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8

Надеюсь, это поможет кому-то:)

Ответ 2

Я решил большинство проблем, объединив множество решений:

  • Убедитесь, что application.rb имеет следующую строку: config.encoding = "utf-8".
  • Убедитесь, что вы используете "mysql2" gem
  • Поместите # encoding: utf-8 вверху любого файла, содержащего символы utf-8.
  • Добавьте следующие две строки над строкой <App Name>::Application.initialize! в environment.rb:

    Encoding.default_external = Encoding::UTF_8
    Encoding.default_internal = Encoding::UTF_8
    

http://rorguide.blogspot.com/2011/06/incompatible-character-encodings-ascii.html

Ответ 3

Убедитесь, что у вас config.encoding = "utf-8" в config/application.rb. Кроме того, ваш пример файла перевода не совпадает с ключом, который вы ищете (com_name и first_name), но я полагаю, что это может быть опечатка.

Ответ 4

Вы уверены, что ваш файл es.yml был сохранен как UTF-8?

Если вы используете Windows, используйте http://notepad-plus-plus.org/, чтобы убедиться.

Ответ 5

Использование этой функции распаковки помогло мне разобраться в этом, попробуйте, если вы получите сообщение об ошибке "Невозможно преобразовать сообщение об ошибке":

myString.unpack('U*').pack('U*')