Rails + Ruby 1.9 "неверная последовательность байтов в US-ASCII" - PullRequest
2 голосов
/ 19 января 2010

После обновления до ruby ​​1.9 мы начали замечать, что страницы не могут отображаться из рендера шаблонов rails, когда пользователь использовал символ не ASCII. Конкретно "é". Мне удалось решить эту проблему на одном из наших промежуточных серверов, но я не смог воспроизвести исправление на нашем производственном сервере.

Исправление, которое, казалось, сработало в первый раз:

  1. Преобразовал базу данных из латиницы в utf8 с помощью инструмента convert_charset, доступного здесь: http://www.mysqlperformanceblog.com/2009/03/17/converting-character-sets/. (включая настройку default_character_set=utf8 в my.cnf и запуск SET GLOBAL character_set_server=utf8

  2. Переключено на адаптер sam-mysql-ruby (вместо стандартного адаптера mysql: http://gemcutter.org/gems/sam-mysql-ruby)

  3. Перезапущенные рельсы

Ошибка: "invalid byte sequence in US-ASCII" Как ни странно, после выполнения вышеуказанных действий ошибка не изменилась на нашем производственном сервере. Установка encoding: utf8 в database.yml также не изменит ошибку.

Ошибка в следующей строке кода: <%= link_to h(question.title), question_path(question) %>

Этот блог предлагает исправление, но упоминает, что это не должно быть проблемой в 1.9: http://www.igvita.com/2007/04/11/secure-utf-8-input-in-rails/ (и ему более 2 лет).

Я полагаю, что эта проблема вскоре может затронуть многих людей, так как все больше разработчиков рельсов переходят на 1.9.

Ответы [ 3 ]

1 голос
/ 19 января 2010

Я нашел решение:

Проблема:

Fetching data from any database (Mysql, Postgresql, Sqlite2 & 3), all configured to have UTF-8 as it's character set, returns the data with ASCII-8BIT in ruby 1.9.1 and rails 2.3.2.1. (Взято из: https://rails.lighthouseapp.com/projects/8994/tickets/2476)

Моя попытка использовать пропатченный адаптер mysql, скорее всего, не удалась, поскольку моя база данных не была настроена на использование utf8, поэтому пропатченный адаптер не работал должным образом.

Исправление закончилось тем, что использовал файл патча, доступный здесь: http://gnuu.org/2009/11/06/ruby19-rails-mysql-utf8/

require 'mysql'

class Mysql::Result
  def encode(value, encoding = "utf-8")
    String === value ? value.force_encoding(encoding) : value
  end

  def each_utf8(&block)
    each_orig do |row|
      yield row.map {|col| encode(col) }
    end
  end
  alias each_orig each
  alias each each_utf8

  def each_hash_utf8(&block)
    each_hash_orig do |row|
      row.each {|k, v| row[k] = encode(v) }
      yield(row)
    end
  end
  alias each_hash_orig each_hash
  alias each_hash each_hash_utf8
end

(помещается в lib / mysql_utf8fix.rb и требуется в enviornment.rb с использованием require 'lib/mysql_utf8fix.rb')

0 голосов
/ 25 апреля 2011

Пожалуйста, используйте mysql2 (gem) адаптер вместо mysql адаптер в database.yml

и удалите исправления mysql (если существует) и добавьте следующие строки в environment.rb.

Encoding.default_external = Кодировка :: UTF_8

Encoding.default_internal = Кодировка :: UTF_8

Тогда беги в apache и пассажире все будет работать нормально

Спасибо

Раманавель Сельвараджу.

0 голосов
/ 18 марта 2011

требуется только mysql_utf8fix.rb (rails 2.3.11)

...