Rails,PostgreSQL和非标准字符的编码错误



我收到以下错误:

ActiveRecord::StatementInvalid: PG::Error: ERROR: invalid byte sequence for encoding "UTF8": 0xf66e6bf6 : INSERT INTO "response_sets" ("city") VALUES ('Jönköping') RETURNING "id"

数据库是 Heroku 应用程序上的 PostgreSQL 9.0.6。

当有奇怪的字符时,不知道如何解决该错误。

数据库未

设置为与尝试插入的字符串相同的编码方案。我会想象 Heroku 上的 Postgres 默认设置为 UTF-8,如果我不得不猜测,您的输入可能是拉丁语变体之一。您可以将数据库设置为接受您提供的编码方案,例如:

SET CLIENT_ENCODING 'ISO-8859-2'

或者您可以将输入转码为 UTF-8(这可能更好)

"my string".encode('UTF-8')
数据库可能

未设置为与要插入的字符串相同的编码。 Postgres 通常是 UTF-8。您必须在字符串上设置正确的编码。
这可能很简单

"string".encode('UTF-8')

或者,如果字符串标记不正确,您可能还必须先force_encoding。 即。它被存储为"Windows-1252",但Ruby没有这样标记。

"string".force_encoding('Windows-1252').encode('UTF-8')

我们在使用 Sendgrid + Heroku Rails 时遇到了这个问题。http://blog.zenlike.me/2013/04/06/sendgrid-parse-incoming-email-encoding-errors-for-rails-apps-using-postgresql/

似乎对我有用:

"HernxE1ndez".encode('UTF-8','ISO-8859-1')
第一个参数是您希望字符串所在的编码

,第二个参数是你认为字符串所在的编码。

字符串#编码

文档中还有有关如何处理无效或未定义字符的选项。

这是我最终使用的(只是为了安全起见):

"HernxE1ndez".encode('UTF-8','ISO-8859-1', :invalid => :replace, :undef => :replace, :replace => "?")

您还可以组成一个帮助程序方法:

def convert_to_utf_8(string)
  string.encode('UTF-8','ISO-8859-1', :invalid => :replace, :undef => :replace, :replace => "?")
end

我遇到的问题是从亚马逊商家服务 API 加载数据。

最新更新