2017-08-03 15 views
2

私が期待どおりに動作しているのと同じ(Railsの4.2.7.1)Herokuの内の2台のサーバーでアプリケーションと1を実行している:のRails、同じバージョン

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

両方のサーバーが同じルビー(ルビー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-sourcecodeの 'RUBY_ENCODING_H'定数まで多くのソースコードを調べました。誰かが継続しているように感じるなら、それまでのところです。編集:そして、より多くの検索は、readlineサポートとのコンパイルに向かう..?しかし、私は質問に特定の答えがありません - 申し訳ありません! –

答えて

3

なぜなら安全対策

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

としてエスケープユニコード配列(例えば> u003eなど)などActiveSupport::JSON::Encoding.escape_html_entities_in_json

、エンコード> trueの場合、<、&のまた、

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

関連する問題