5

次のエラーが表示されます。

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 です。

奇妙な文字がある場合、そのエラーを回避する方法がわかりません。

4

3 に答える 3

8

データベースが、挿入しようとしている文字列と同じエンコード スキームに設定されていません。Heroku 上の Postgres はデフォルトで UTF-8 を使用するように設定されていると思いますが、推測する必要がある場合、入力はラテン語のバリエーションの 1 つになる可能性があります。提供しているエンコーディングスキームを受け入れるようにデータベースを設定できます。たとえば、次のようになります。

SET CLIENT_ENCODING 'ISO-8859-2'

または、入力を UTF-8 にトランスコードすることもできます (おそらくこれの方が優れています)。

"my string".encode('UTF-8')
于 2012-10-04T14:01:40.533 に答える
4

データベースが、挿入する文字列と同じエンコーディングに設定されていない可能性があります。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/でこの問題が発生しました。

于 2013-04-06T08:54:59.673 に答える
0

これは私にとってはうまくいくようです:

"Hern\xE1ndez".encode('UTF-8','ISO-8859-1')

最初の引数は文字列に使用するエンコーディングで、2 番目の引数は文字列に使用すると思われるエンコーディングです。

文字列#エンコード

ドキュメントには、無効な文字または未定義の文字を処理する方法に関するオプションもあります。

これは私が最終的に使用したものです(念のため):

"Hern\xE1ndez".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

私が抱えていた問題は、Amazon Merchant Services API からデータをロードすることでした。

于 2016-02-16T08:30:47.393 に答える