1

Ruby 1.9.3pl194 を使用して、JSONおよび logfileで使用する非 ASCII Unicode 文字を含む文字列をエスケープしようとしています。JSON を消費するものは非 ASCII を処理できないため、エスケープされたバージョンを作成する必要がありますが...

a = "Abc\u00eddef"
puts a
puts a.inspect

生成:

Abcídef
"Abc\u00EDdef"

Abc\u00eddef2 番目の出力には不要な二重引用符が含まれていることに注意してください。文字列だけをファイルに書き込みたいので、引用符は必要ありません。JSON 文字列で使用するためだけではありません。

使ってみても同じことが起こりますActionSupport::JSON.decode(b)

私はただできることを知っています

puts a.inspect[1..-2]

しかし、それはちょっと醜いです。確かに、引用符を取り除かずにこれを行う方法はありますか?

それは単純な古いRubyなので.html_safe、レールに入っているわけではありません(それが機能するかどうかはわかりません)。

4

1 に答える 1

0

ActiveSupport がこの問題に取り組む方法は次のとおりです。

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)、引用符を使用して削除することです (本当に必要な場合)。

于 2012-10-04T19:45:03.427 に答える