1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

JSON.escape returns UTF-8 strings

[#2849 state:resolved]
This commit is contained in:
Jeremy Kemper 2009-07-01 16:22:17 -07:00
parent f37a2ea84c
commit 49824e8ad6
2 changed files with 14 additions and 7 deletions

View file

@ -1,4 +1,4 @@
# encoding: binary
# encoding: utf-8
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/hash/slice'
@ -97,12 +97,14 @@ module ActiveSupport
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
end

View file

@ -75,8 +75,13 @@ class TestJSONEncoding < Test::Unit::TestCase
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