2011-01-19 3 views
5

Я просто случайно получил эту странную ошибку с помощью Rails 3, на Heroku (Postgres)Rails 3, Heroku - PGError: ОШИБКА: неверная последовательность байт для кодирования "UTF8":

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' ...... 

намек в то время как хороший ISN» я ничего не делал для меня. Могу ли я установить кодировку где-нибудь? Должен ли я даже с этим бороться? Кто-нибудь видел это и/или имел какие-либо идеи о том, как бороться с этим типом проблемы?

Спасибо

ответ

6

Из того, что я могу собрать, это проблема, когда строка, которую вы пытаетесь вставить в ваш 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. См. Документацию here.

  • Более хакерское решение состоит в том, чтобы переопределить ваши геттеры и сеттеры в модели (то есть 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

Спасибо vonconrad, вы спасатель жизни. У меня есть config.ecoding правильно. Хотя, возможно, Хероку что-то меняет при развертывании. Если я пойду с решением iconv, которое кажется самым умным выбором из вашего комментария, какие-либо видимые проблемы при переходе на Ruby 1.9? Кроме того, документ довольно пуст для iconv, и я новичок, чтобы посмотреть пример? благодаря! – AnApprentice

+3

Я считаю, что 'iconv' должен работать как для 1.8, так и для 1.9. Что касается кода, то что-то вроде этого должно работать: 'content = :: Iconv.conv ('UTF-8 // IGNORE', 'UTF-8', content + '') [0 ..- 2]'. В принципе, это заставляет кодирование быть UTF-8, независимо от того, что изначально было. Я получил код отсюда: http://stackoverflow.com/questions/4583924/string-force-encoding-in-ruby-1-8-7-or-rails-2-x/4585362#4585362 – vonconrad

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