34

У меня возникли проблемы с паролем Rails 3.0.1, Ruby 1.9.2 и локализацией моего сайта.Ruby on Rails 3, несовместимые кодировки символов: UTF-8 и ASCII-8BIT с i18n

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

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

и es.yml файл:

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

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

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

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

Знал ли кто-нибудь, как это работает?

Благодарим за помощь.

+0

Это своего рода не по теме, но Райан Бейтс только что опубликовал railscast (http://railscasts.com/episodes/256-i18n-backends) на i18n сегодня. Если кто-нибудь увидит этот комментарий на неделе 3/6/2011, то каким-то образом этот комментарий подходит для вас. – DJTripleThreat

+2

Джеймс имеет довольно хороший учебник в своем блоге, покрывающий почти все аспекты кодирования строк в Ruby 1.9. Чтобы понять, что означает «внешнее» и «внутреннее» кодирование, прочитайте его по адресу: http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings. –

+0

Вот удивительное объяснение кодировки в Rails: http://yehudakatz.com/2010/ 05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails –

ответ

47

ИТАК проблема решена после нескольких часов прибегая к помощи ...

Был на самом деле две ошибки в своем коде. Первая из них была ошибкой кодирования файла, а вторая - проблемой конфигурации базы данных 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 строки в моей конфигурации/environment.rb

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

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

+2

Спасибо! Имела та же проблема, и у меня все было в порядке, за исключением того, что я использовал mysql gem вместо mysql2. –

+1

То же самое произошло со мной, но я заметил это только в том случае, когда в файле исходного кода был забавный «персонаж». У меня были оба mysql и mysql2 gems в моем gemfile, мне пришлось удалить старый камень mysql. (и измените файл database.yml) – DGM

+1

Чувак, вы спасли мой день или, может быть, неделю! Благодаря! – zigomir

0

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

+0

Oups sry о примере. Я просто взял плохой, без символа UTF-8: p Какой бы я ни был ... у меня есть config.encoding = "utf-8" в моем приложении.rb и Encoding.default_external = Encoding :: UTF_8 в моей среде.rb. Спасибо :) –

+0

Это может быть очень сложно определить, откуда происходят несовместимые данные. Я бы попытался разбить ваши шаблоны с точки зрения источника данных. Поэтому попробуйте шаблон с только материалами I18n, другой с данными из базы данных , то же самое для вашего кеша, если у вас его есть, и т. д. Если вы используете MySQL, попробуйте переключиться на драйвер mysql2 и убедитесь, что config/database.yml задает кодировку: utf-8 – noodl

+0

Спасибо :) Хорошо, я проверил и может получать и отображать строки i18n из базы данных MySQL. Но я не могу получить строки из файла i18n, и до сих пор я не использую кеш. –

0

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

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

23

Я решил большинство проблем путем объединения многих решений:

  • Убедитесь, что 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

+1

Этот ответ: http://stackoverflow.com/a/4804802/72176 имеет хороший способ добавить предлагаемую '# кодировку: UTF-8' ко всем рубиновым файлам. –

+1

Я добавил только '# encoding: utf-8' на первом из моего контроллера, и все хорошо. У меня есть Rails 3.2.7 на Ruby 1.9.3 –

+0

Слово совета: mysql2 gem подходит только для MRI Ruby, не используйте его с jruby. –

0

Используя эту распакуйте функцию помогла мне разобраться в этом, наконец, попробовать это, если вы получите банку» t convert error:

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

Звучит немного дорогостоящим и болезненным CPU, если вам нужно сделать это на всех строках ... –

+0

Хотелось бы, чтобы у меня были другие возможности, чтобы остановить эту ошибку, но они не работал для меня. Я не заметил увеличения cpu, – flunder

+0

знаю, что я попробую ответить на первое решение ответа позже, потому что и отчитаться назад – flunder

Смежные вопросы