Ruby on rails Rails 3,heroku-PGError:错误:编码的字节序列无效;UTF8";:

Ruby on rails Rails 3,heroku-PGError:错误:编码的字节序列无效;UTF8";:,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我只是在heroku(postgres)上通过Rails 3随机得到了这个奇怪的错误 这个提示虽然很好,但对我来说并没有任何作用。我可以在什么地方设置编码吗?我是不是该搞砸了?有人看到这一点和/或对如何处理这类问题有任何想法吗 谢谢据我所知,这是一个问题,您试图插入PostgrSQL server的字符串没有使用UTF-8编码。这有点奇怪,因为Rails应用程序在默认情况下应该配置为使用UTF-8 有几种方法可以尝试修复此问题(按照我建议的顺序): 首先,确保在config/applicati

我只是在heroku(postgres)上通过Rails 3随机得到了这个奇怪的错误

这个提示虽然很好,但对我来说并没有任何作用。我可以在什么地方设置编码吗?我是不是该搞砸了?有人看到这一点和/或对如何处理这类问题有任何想法吗


谢谢

据我所知,这是一个问题,您试图插入PostgrSQL server的字符串没有使用UTF-8编码。这有点奇怪,因为Rails应用程序在默认情况下应该配置为使用UTF-8

有几种方法可以尝试修复此问题(按照我建议的顺序):

  • 首先,确保在
    config/application.rb
    中将
    config.encoding
    设置为
    “utf-8”

  • 如果您使用的是Ruby 1.9,则可以尝试在插入之前使用
    toutf8
    强制进行字符编码

  • 您可以确定字符串的编码方式,并手动将
    set CLIENT_ENCODING设置为“ISO-8859-1”(或任何编码)。不要忘记执行
    重置客户端编码在语句之后重置编码

  • 如果您使用的是Ruby 1.8(更可能),那么可以使用iconv库将字符串转换为UTF-8。见文件

  • 一个更黑客的解决方案是覆盖模型中的getter和setter(即
    content
    content=
    ),用Base64对字符串进行编码和解码。看起来是这样的:

文本。强制编码(字符集)。编码(“UTF-8”)


谢谢你,Voncorad,你是个救命恩人。我确实正确设置了config.ecoding。虽然Heroku可能在部署上有所改变。如果我使用iconv解决方案,从您的评论来看,这似乎是最明智的选择,那么在升级到Ruby 1.9时,有什么问题吗?另外,对于iconv来说,文档是相当空的,我是一个新手,有没有看到一个例子?谢谢我相信
iconv
应该适用于1.8和1.9。至于代码,类似这样的东西应该可以工作:
content=::Iconv.conv('UTF-8//IGNORE','UTF-8',content+'')[0..-2]
。基本上,这强制编码为UTF-8,不管它最初是什么。我从这里得到了密码:
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' ......
require 'base64'

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

  def content=(value)
    self[:content] = Base64::encode64(value)
  end
end