Rails 3,Heroku:点击服务器错误:PGError:错误:编码“UTF8”的无效字节序列:0xba

时间:2011-09-14 22:01:25

标签: ruby-on-rails ruby-on-rails-3 postgresql utf-8 heroku

我有一个Rails 3.0.9应用程序,在我的dev env本地运行,并在heroku应用程序上远程运行。我有a method that imports a CSV file into a model,此文件可以包含非英文字符,例如°,á,é,í等等(它是西班牙语)。

我目前能够在我的本地开发(SQLite)数据库中导入完整文件(75k记录)而没有任何问题;但是,当使用heroku db:push将数据库上传到heroku时,它会失败,并且我在标题中发布错误

!!! Caught Server Exception

HTTP CODE: 500
Taps Server Error: PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xba
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".

显然,Heroku在插入'°'字符时会出现问题。 (目前文件中没有任何á,é,í等字符,但我怀疑这些字符也可能会失败。)

我在application.rb文件中设置了默认编码,如下所示:

#.../application.rb
config.encoding = "utf-8"

我还可以做些什么来设置'客户端编码'并解决这个问题?

1 个答案:

答案 0 :(得分:4)

numero signºISO-8869-1中的0xBA不是UTF-8。因此,您的CSV文件使用Latin-1进行编码,但您尝试将其作为UTF-8存储在数据库中,而无需修复编码。

您可以尝试告诉您的CSV库它正在处理Latin-1编码的文本,也许它会负责转换为UTF-8。如果这不起作用,那么您可以使用Iconv

自行完成
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xba")
 => ["º"]
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xb0")
 => ["°"]

你没有遇到SQLite的麻烦,因为SQLite往往非常宽容,它有一个非常松散的类型系统。 PostgreSQL,OTOH,往往是相当严格的,如果你试图提供无效数据,就会抱怨。如果您要部署到Heroku和PostgreSQL,我建议您停止在SQLite之上进行开发,还有其他差异会导致问题(例如GROUP BY和LIKE的行为)。