【发布时间】:2012-12-13 19:11:03
【问题描述】:
我在 Rails 应用程序中遇到了 unicode 字符问题。问题是当我用一些包含斯堪的纳维亚字符的字符串存储对象时,这些字符在使用 to_json 方法时不会正确呈现。基本上所有这些字符都是这样渲染的:
\"description\":\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\"
示例如下:
Item.create(:title => "Test title", :description => "With scandic characters öäöäö")
=> #<Item id: 198, title: "Test title", priority: nil, description: "With scandic characters öäöäö", bought_when: nil, warranty_until: nil, created_at: "2012-12-04 15:22:19", updated_at: "2012-12-04 15:22:19", user_id: nil, custom_id: nil, uuid: nil, position: 1, public: nil, secure_details: "", bookmark_id: nil, giveaway: nil, trash: false>
此时创建的对象看起来没问题。
Item.last
返回
=> #<Item id: 198, title: "Test title", priority: nil, description: "With scandic characters \xC3\xB6\xC3\xA4\xC3\xB6\xC3\xA4\xC3\xB6", bought_when: nil, warranty_until: nil, created_at: "2012-12-04 15:22:19", updated_at: "2012-12-04 15:22:19", user_id: nil, custom_id: nil, uuid: nil, position: 1, public: nil, secure_details: "", bookmark_id: nil, giveaway: nil, trash: false>
这个“带有扫描字符 \xC3\xB6\xC3\xA4\xC3\xB6\xC3\xA4\xC3\xB6” - 看起来还可以吗?还是我在项目创建阶段已经错过了一些正确的编码?
无论如何,现在当调用 Item.last.to_json 时,我得到了这个:
"description\":\"With scandic characters \\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\"
在这一点上,字符串肯定是坏的。
我对 Rails 中正确的字符编码缺乏一些知识,因此任何提示都将不胜感激。但是,该项目在浏览器中呈现时看起来不错 - 这仅在执行 JSON 响应时才会发生。
【问题讨论】:
-
您确定您的数据库的字符集配置正确吗?例如,我不认为 MySQL 的默认值是 UTF8,并且在最近的某个时间点,PostgreSQL 的默认值是 7 位 ASCII。很明显,输入 (
Item.create) 和输出 (Item.last) 之间存在转换——在转到to_json之前,我会对此进行调查。 -
是的,就是这样! MySQL 数据库不是 unicode。我现在通过使用这个 railcast 迁移到 PosgreSQL 设法解决了这个问题:railscasts.com/episodes/342-migrating-to-postgresql
标签: ruby-on-rails json unicode