我有一个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"
我还可以做些什么来设置'客户端编码'并解决这个问题?
答案 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的行为)。