Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

JSON.escape returns UTF-8 strings

[#2849 state:resolved]
  • Loading branch information...
commit 5217c16b094a07919348b52aa164ca2fd26b5d5e 1 parent 97ad936
Jeremy Kemper jeremy authored
12 activesupport/lib/active_support/json/encoding.rb
View
@@ -1,4 +1,4 @@
-# encoding: binary
+# encoding: utf-8
require 'active_support/core_ext/module/delegation'
require 'active_support/deprecation'
@@ -51,12 +51,14 @@ def escape_html_entities_in_json=(value)
def escape(string)
string = string.dup.force_encoding(::Encoding::BINARY) if string.respond_to?(:force_encoding)
- json = '"' + string.gsub(escape_regex) { |s| ESCAPED_CHARS[s] }
- json.gsub(/([\xC0-\xDF][\x80-\xBF]|
+ json = string.
+ gsub(escape_regex) { |s| ESCAPED_CHARS[s] }.
+ gsub(/([\xC0-\xDF][\x80-\xBF]|
[\xE0-\xEF][\x80-\xBF]{2}|
[\xF0-\xF7][\x80-\xBF]{3})+/nx) { |s|
- s.unpack("U*").pack("n*").unpack("H*")[0].gsub(/.{4}/, '\\\\u\&')
- } + '"'
+ s.unpack("U*").pack("n*").unpack("H*")[0].gsub(/.{4}/n, '\\\\u\&')
+ }
+ %("#{json}")
end
# Converts a Ruby object into a JSON string.
9 activesupport/test/json/encoding_test.rb
View
@@ -74,8 +74,13 @@ def test_hash_encoding
def test_utf8_string_encoded_properly_when_kcode_is_utf8
with_kcode 'UTF8' do
- assert_equal '"\\u20ac2.99"', ActiveSupport::JSON.encode('€2.99')
- assert_equal '"\\u270e\\u263a"', ActiveSupport::JSON.encode('✎☺')
+ result = ActiveSupport::JSON.encode('€2.99')
+ assert_equal '"\\u20ac2.99"', result
+ assert_equal(Encoding::UTF_8, result.encoding) if result.respond_to?(:encoding)
+
+ result = ActiveSupport::JSON.encode('✎☺')
+ assert_equal '"\\u270e\\u263a"', result
+ assert_equal(Encoding::UTF_8, result.encoding) if result.respond_to?(:encoding)
end
end
Please sign in to comment.
Something went wrong with that request. Please try again.