diff options
Diffstat (limited to 'activesupport/lib/active_support/json/encoders/string.rb')
-rw-r--r-- | activesupport/lib/active_support/json/encoders/string.rb | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/json/encoders/string.rb b/activesupport/lib/active_support/json/encoders/string.rb new file mode 100644 index 0000000000..707298d987 --- /dev/null +++ b/activesupport/lib/active_support/json/encoders/string.rb @@ -0,0 +1,27 @@ +module ActiveSupport + module JSON + module Encoding + ESCAPED_CHARS = { + "\010" => '\b', + "\f" => '\f', + "\n" => '\n', + "\r" => '\r', + "\t" => '\t', + '"' => '\"', + '\\' => '\\\\' + } + end + end +end + +class String + def to_json #:nodoc: + '"' + gsub(/[\010\f\n\r\t"\\]/) { |s| + ActiveSupport::JSON::Encoding::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\&') + } + '"' + end +end |