Rails 3, heroku - PGError: ERROR: неверная последовательность байтов для кодировки "UTF8": - PullRequest
5 голосов
/ 20 января 2011

Я случайно получил эту странную ошибку через Rails 3, на heroku (postgres)

PGError: ERROR: invalid byte sequence for encoding "UTF8": 0x85 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". : INSERT INTO "comments" ("content") VALUES ('BTW∑I re-listened to the video' ......

Подсказка, в то время как приятно, ничего не заставляет меня щелкать.Можно ли где-нибудь установить кодировку?Должен ли я даже возиться с этим?Кто-нибудь видел это и / или есть какие-либо идеи о том, как бороться с этим типом проблемы?

Спасибо

Ответы [ 2 ]

6 голосов
/ 20 января 2011

Из того, что я могу понять, это проблема, когда строка, которую вы пытаетесь вставить на свой сервер PostgrSQL, не кодируется с помощью UTF-8. Это несколько странно, потому что ваше Rails-приложение должно быть настроено на использование UTF-8 по умолчанию.

Существует несколько способов исправить это (в порядке, который я рекомендую):

  • Во-первых, убедитесь, что для config.encoding установлено значение "utf-8" в config/application.rb.

  • Если вы используете Ruby 1.9, вы можете попытаться форсировать кодировку символов перед вставкой с помощью toutf8.

  • Вы можете выяснить, с чем закодирована ваша строка, и вручную установить SET CLIENT_ENCODING TO 'ISO-8859-1'; (или какова бы ни была кодировка) в вашем соединении PostgeSQL перед вставкой строки. Не забудьте сделать RESET CLIENT_ENCODING; после оператора для сброса кодировки.

  • Если вы используете Ruby 1.8 (что более вероятно), вы можете использовать библиотеку iconv для преобразования строки в UTF-8. См. Документацию здесь .

  • Более хакерским решением является переопределение ваших методов получения и установки в модели (то есть content и content=), кодирование и декодирование вашей строки с помощью Base64. Это будет выглядеть примерно так:

require 'base64'

class Comment
  def content
    Base64::decode64(self[:content])
  end

  def content=(value)
    self[:content] = Base64::encode64(value)
  end
end
0 голосов
/ 01 октября 2013
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...