【问题标题】:Escaping Unicode characters in Ruby without getting extra double quotes在 Ruby 中转义 Unicode 字符而不获得额外的双引号
【发布时间】:2012-10-04 14:30:21
【问题描述】:

我正在尝试使用 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 中(不确定这是否可行)。

【问题讨论】:

  • 剥离非 ASCII 字符会使生成的文本不可读或变成无意义的。你需要保持它的意义吗?您可以使用 HTML 编码,它将所有非 ASCII 转换为安全的东西,但您可以在必要时恢复这些值。

标签: ruby unicode escaping


【解决方案1】:

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) 并去掉引号(如果你真的必须的话)。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多