2012-10-04 21 views
1

我試圖轉義一個包含非ASCII字符的字符串,用於JSON 和日誌文件,使用Ruby 1.9.3pl194。事情消耗JSON,所以我需要產生一個轉義版本,但不能處理非ASCII ...在Ruby中轉義Unicode字符時沒有得到額外的雙引號

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

生產:

Abcídef 
"Abc\u00EDdef" 

注意,第二輸出包括不需要雙引號,我不想要引號,因爲我只想將字符串Abc\u00eddef寫入文件;它不僅僅用於JSON字符串。

同樣的事情發生,如果我嘗試使用ActionSupport::JSON.decode(b)

我知道我可以做

puts a.inspect[1..-2] 

但是這是一種醜,肯定有這樣做,而不必剝離報價的方式?

這是普通的老紅寶石,所以我沒有.html_safe來在軌道(不知道這是否會工作或不管)。

+0

剝離非ASCII字符可能會導致生成的文本無法讀取或將其變爲無意義。你需要保持它的意義嗎?您可以使用HTML編碼,將所有非ASCII轉換爲安全的東西,但如果需要,您可以恢復這些值。 –

回答

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)並刪除引號(如果您確實需要的話)。

相關問題