在我的控制器中,以下作品(打印“oké”)
puts obj.inspect
但这不(提供“ ok \ u00e9”)
render :json => obj
显然,该to_json方法转义了unicode字符。有防止这种情况的选项吗?
to_json
如果你挖通了源,你最终会来ActiveSupport::JSON::Encoding和escape方法:
ActiveSupport::JSON::Encoding
escape
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的任何东西都可以接受的,但是\uXXXX如有必要,您始终可以对JSON(或经过修改的JSON逃逸器中的猴子补丁)进行后处理,以将表示法转换为原始UTF-8。
gsub
\uXXXX
我同意强制将JSON设为7bit-clean是有点虚假的,但是您就可以了。
简短的回答:不。