2017-08-03 45 views
2

我運行相同的(Rails的4.2.7.1)在Heroku的兩臺服務器和一個應用程序正在按預期:Rails的HTML編碼裏面JSON不同,同一版本

ActiveSupport::JSON.encode(html: '<p>Hello World</p>') 
#=> "{\"html\":\"<p>Hello World</p>\"} 

上運行相同的代碼第二服務器產生不同的結果:

ActiveSupport::JSON.encode(html: '<p>Hello World</p>') 
#=> "{\"html\":\"\\u003cp\\u003eHello World\\u003c/p\\u003e\"}" 

兩個服務器都具有相同的Ruby(紅寶石2.2.6p396),並從我收集到的ENV['LANG']起着編碼的作用,但兩臺服務器都存儲在同一個價值有:"en_US.UTF-8"

感謝您的幫助。

其他詳細信息:兩個服務器生成的字符串都使用UTF-8編碼。

ActiveSupport::JSON.encode(html: '<p>Hello World</p>').encoding 
=> #<Encoding:UTF-8> 
+2

Ruby是如何編譯的?我查看了從ActiveSupport :: JSON.encode到CRuby源代碼中的'RUBY_ENCODING_H'常量的儘可能多的源代碼。就我所知,如果任何人都覺得繼續下去。編輯:和更多的搜索去與readline支持編譯..?不過,我對這個問題沒有具體的答案 - 抱歉! –

回答

3

正是由於ActiveSupport::JSON::Encoding.escape_html_entities_in_json

如果爲真,編碼>,<,&爲轉義的unicode序列(例如>如u003e)作爲安全措施

ActiveSupport::JSON::Encoding.escape_html_entities_in_json = false 
encode = ActiveSupport::JSON.encode(html: '<p>Hello World</p>') 
#=> "{\"html\":\"<p>Hello World</p>\"} 

ActiveSupport::JSON::Encoding.escape_html_entities_in_json = true 
encode = ActiveSupport::JSON.encode(html: '<p>Hello World</p>') 
#=> "{\"html\":\"\\u003cp\\u003eHello World\\u003c/p\\u003e\"}" 

同樣來自source code,其實現非常簡單。

def to_json(*) 
    if Encoding.escape_html_entities_in_json 
    super.gsub ESCAPE_REGEX_WITH_HTML_ENTITIES, ESCAPED_CHARS 
    else 
    super.gsub ESCAPE_REGEX_WITHOUT_HTML_ENTITIES, ESCAPED_CHARS 
    end 
end 
+1

感謝您的詳細回覆,我已升級到Rails 5,我無法重現該問題。我可能會將舊版本的應用程序部署到臨時服務器,以查看通過此新信息得到的內容。 – Leito