我在 Heroku 的两台服务器上运行相同的 (Rails 4.2.7.1) 应用程序,其中一台按预期工作:
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 (ruby 2.2.6p396),从我收集到的信息来看,ENV['LANG']
在编码中发挥作用,但两台服务器存储了相同的值在那里:“en_US.UTF-8”
。
感谢您的帮助。
其他详细信息:两个服务器生成的字符串均使用 UTF-8 编码。
ActiveSupport::JSON.encode(html: '<p>Hello World</p>').encoding
=> #<Encoding:UTF-8>
最佳答案
是因为ActiveSupport::JSON::Encoding.escape_html_entities_in_json
If true, encode >, <, & as escaped unicode sequences (e.g. > as u003e) as a safety measure
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
关于ruby-on-rails - Rails 在 JSON 中以不同方式编码 HTML,相同版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45492890/