我有一个 Rails 3.0.9 应用程序,既在我的开发环境中本地运行,又在 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"
我还能做些什么来设置“客户端编码”并解决这个问题?
最佳答案
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 的行为)。
关于ruby-on-rails - rails 3,Heroku : Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xba,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423519/