小编典典

JSON编码错误地转义了(Rails 3,Ruby 1.9.2)

json

在我的控制器中,以下作品(打印“oké”)

puts obj.inspect

但这不(提供“ ok \ u00e9”)

render :json => obj

显然,该to_json方法转义了unicode字符。有防止这种情况的选项吗?


阅读 184

收藏
2020-07-27

共1个答案

小编典典

如果你挖通了源,你最终会来ActiveSupport::JSON::Encodingescape方法:

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。

我同意强制将JSON设为7bit-clean是有点虚假的,但是您就可以了。

简短的回答:不。

2020-07-27