ruby-on-rails - Rails 在 JSON 中以不同方式编码 HTML,相同版本

标签 ruby-on-rails json heroku

我在 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/

相关文章:

java - 将数据从 fragment 发送到 Activity 并解析 json

ios - 在 Rails 中使用 RPush (APNs) 推送给特定用户

ruby-on-rails - 使用 grouped_collection_select 按枚举对模型进行分组

mysql - 我必须在生产中使用 root 吗

ruby-on-rails - Rails 5 控制台需要在 macOS Sierra 上使用 readline 6

ruby-on-rails - Rails回形针:更新vs. update_attributes

json - 在不知道 key 的情况下打印第一个值

javascript - 尝试将获取的 JSON 数据附加到字段,但这不起作用

node.js - Heroku 上找不到 js 文件

ruby - Heroku 上的 OpenSSL 1.0.1