2013-02-12 52 views
1

I 升級 降級爲rails 2.3.17由於安全錯誤,但現在我無法解碼JSON字符串,如果他們有Unicode保存到數據庫:(。有沒有辦法來處理字符串,使其正確解碼?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>' 

因爲它是從DB這樣的未來我不能改變的第一行。

這用於工作。

+0

儘量不要使用,而不是基本傑森庫的ActiveSupport。 – Linuxios 2013-02-12 01:29:36

回答

0
  • 切換到2.3.15應該沒問題,因爲那是修復程序着陸的時候。
  • 詛咒誰開始在軌項目
  • 上移植到蟒蛇後急速
0

JSON gem將正確處理此問題。

作爲說明,gem比其他JSON解析器要嚴格得多。例如:

{ 'test' : 'value' } 

這是無效的JSON,即使它看起來沒問題。

無論出於什麼原因,非UTF-8精明的JSON解析器作爲2.3.16補丁的一部分發布,這對維護人員來說確實很sl on。

+0

不起作用,因爲數據庫中的值使用ActiveSupport :: JSON.encode編碼,我懷疑gem能夠解碼所有值。我暫時通過從2.3.17升級到2.3.15來修復它。我認爲這只是一個積極的支持錯誤。 – Brian 2013-02-12 01:41:39

+0

哎呀。您可以隨時瀏覽所有記錄,使用破解的解析器進行解碼,使用正在工作的解碼器進行編碼,然後將其保存到原位。 – tadman 2013-02-12 02:34:47

2

您可以更改的ActiveSupport後端JSON提供商開始工作的開發者。

ActiveSupport::JSON.backend = "JSONGem"添加到應用程序初始化程序中(我將它添加到application.rb中)。這解決了我在將activesupport升級到3.0.20後所具有的unicode解析問題。

查看vulnerability notice which caused this update - 它提到這個解決方法也適用於2.3.16。

從鐵軌控制檯:

> 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’"}