【问题标题】:Rails 3, Heroku: Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xbaRails 3,Heroku:点击服务器错误:PGError:错误:编码“UTF8”的字节序列无效:0xba
【发布时间】:2011-09-14 22:01:25
【问题描述】:

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

我目前能够在我的本地开发 (SQLite) 数据库中导入完整文件(75k 条记录)而没有任何问题;但是,当使用 heroku db:push 将 db 上传到 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"

我还能做些什么来设置“客户端编码”并解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    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 的行为)。

    【讨论】:

    • 感谢您的详细解释。我会听从你直接在 PostreSQL 之上开发的建议,因为这不是我第一次遇到这种性质的问题。不太清楚的是您建议的 Iconv 用法。我将如何将其应用于导入方法?还是我应该用 Iconv 以某种方式清理 CSV 文件? (假设我无法直接获取 UTF-8 中的文本)
    • @bruno077:您可以旋转整个 SQLite 数据库以修复编码(fixed = Iconv.iconv(...., sqlite_string); 然后将fixed 写回数据库),然后在本地整理好编码后从 SQLite 上传.最终一切都将一直是 UTF-8,直到那时我们才会受苦(但情况肯定比十年前要好得多)。
    • 非常感谢您的帮助。我会标记你的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2022-01-26
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多