我正在尝试使用Ruby 1.9.3pl194转义包含非ASCII Unicode字符的字符串,以便在JSON 和日志文件中使用。使用JSON的东西无法处理非ASCII,所以我需要生成一个转义版本,但是......
a = "Abc\u00eddef"
puts a
puts a.inspect
产生
Abcídef
"Abc\u00EDdef"
请注意,第二个输出包含不需要的双引号,我不想引号,因为我只想将字符串Abc\u00eddef
写入文件;它不仅仅用于JSON字符串。
如果我尝试使用ActionSupport::JSON.decode(b)
我知道我可以做到
puts a.inspect[1..-2]
但这有点难看,肯定有一种方法可以做到这一点,而不必剥离报价?
这是普通的旧Ruby,所以我没有.html_safe
来自rails(不确定这是否会起作用)。
答案 0 :(得分:0)
Here's how ActiveSupport tackles the problem:
def escape(string)
string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
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)
json
end
正如你所看到的那样,这不是微不足道的!因此,最好的解决方案可能是使用ActiveSupport::JSON.encode(whatever)
并删除引号(如果你真的必须)。