aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/json/encoders/string.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/json/encoders/string.rb')
-rw-r--r--activesupport/lib/active_support/json/encoders/string.rb27
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