1

由于安全错误,我已降级到 Rails 2.3.17,但现在我无法解码保存到数据库中的 json 字符串,如果它们中有 unicode :(。有没有办法处理这样的字符串它解码正确?

e = ActiveSupport::JSON.encode({'a' => "Hello Unicode \u2019"})
ActiveSupport::JSON.decode(e)

给我

RangeError: 8217 out of char range
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/backends/okjson.rb:314:in `unquote'
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/backends/okjson.rb:251:in `strtok'
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/backends/okjson.rb:215:in `tok'
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/backends/okjson.rb:178:in `lex'
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/backends/okjson.rb:46:in `decode'
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/backends/okjson.rb:612:in `decode'
from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.17/lib/active_support/json/decoding.rb:14:in `decode'
from (irb):30
from /usr/local/bin/irb:12:in `<main>'

我无法更改第一行,因为它来自数据库。

这曾经奏效。

4

3 回答 3

3

您可以在 ActiveSupport 中更改后端 JSON 提供程序。

添加ActiveSupport::JSON.backend = "JSONGem"到应用程序初始化程序(我将其添加到 application.rb)。这解决了我在将 activesupport 升级到 3.0.20 后遇到的 unicode 解析问题。

请参阅导致此更新的漏洞通知- 它提到此解决方法也应适用于 2.3.16。

从 Rails 控制台:

> ActiveSupport::VERSION::STRING
 => "3.0.20" 
> ActiveSupport::JSON.decode('{"test":"string\u2019"}')
RangeError: 8217 out of char range
> ActiveSupport::JSON.backend = "JSONGem" 
> ActiveSupport::JSON.decode('{"test":"string\u2019"}')
 => {"test"=>"string’"}
于 2013-02-15T03:14:14.323 回答
0

JSON gem将正确处理此问题。

需要注意的是,gem 比其他 JSON 解析器严格得多。例如:

{ 'test' : 'value' }

即使看起来不错,这也不是有效的 JSON。

无论出于何种原因,非 UTF-8 精通的 JSON 解析器作为 2.3.16 补丁的一部分发布,这对维护者来说真的很草率。

于 2013-02-12T01:30:28.343 回答
0
  • 切换到 2.3.15 应该没问题,因为那是修复登陆的时候。
  • 诅咒在 Rails 中启动这个项目的开发者
  • 开始着手移植到 python post haste
于 2013-02-12T01:46:30.947 回答