JSON编码错误地转义(Rails 3,Ruby 1.9.2) [英] JSON encoding wrongly escaped (Rails 3, Ruby 1.9.2)
问题描述
在我的控制器中,以下作品(打印oké)
In my controller, the following works (prints "oké")
puts obj.inspect
但这不会(呈现ok\\\é)
But this doesn't (renders "ok\u00e9")
render :json => obj
显然, to_json
方法转义unicode字符。有没有办法防止这种情况?
Apparently the to_json
method escapes unicode characters. Is there an option to prevent this?
推荐答案
如果你挖掘源码,最终会来到 ActiveSupport :: JSON :: Encoding
和 escape
方法:
If you dig through the source you'll eventually come to ActiveSupport::JSON::Encoding
and the escape
method:
def escape(string)
if string.respond_to?(:force_encoding)
string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
end
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}/n, '\\\\u\&')
}
json = %("#{json}")
json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding)
json
end
各种 gsub
呼叫强制非ASCII UTF-8到您看到的 \uXXXX
符号。十六进制编码的UTF-8应该能够处理JSON的任何事情都可以接受,但是您可以随时对JSON(或修改后的JSON escaper中的猴子补丁)进行后处理,以转换 \uXXXX
如果需要,可以使用原始UTF-8的符号。
The various gsub
calls are forcing non-ASCII UTF-8 to the \uXXXX
notation that you're seeing. Hex encoded UTF-8 should be acceptable to anything that processes JSON but you could always post-process the JSON (or monkey patch in a modified JSON escaper) to convert the \uXXXX
notation to raw UTF-8 if necessary.
我同意强制JSON是7位清理是有点虚假,但你去。
I'd agree that forcing JSON to be 7bit-clean is a bit bogus but there you go.
简答案:否。
这篇关于JSON编码错误地转义(Rails 3,Ruby 1.9.2)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!