2012-10-04 4 views
1

Ruby 1.9.3pl194를 사용하여 JSON 및 로그 파일에서 사용할 비 ASCII 유니 코드 문자가 포함 된 문자열을 이스케이프 처리하려고합니다. 나는 그러나, 이스케이프 버전을 생성 할 필요가 있으므로 비 ASCII를 처리 할 수있는 JSON을 소비하는 것은 ...여분의 큰 따옴표를 사용하지 않고 Ruby에서 유니 코드 문자를 이스케이프 처리합니다.

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

는 생산 : 두 번째 출력은 원치 않는 따옴표를 포함

Abcídef 
"Abc\u00EDdef" 

주 , 나는 단지 문자열 Abc\u00eddef을 파일에 쓰고 싶기 때문에 따옴표가 필요 없다. JSON 문자열에 사용하기위한 것이 아닙니다. 나는 시도하고 난 그냥

puts a.inspect[1..-2] 

할 수있는 알고 ActionSupport::JSON.decode(b)

를 사용하지만 그 종류의 추한 경우

같은 일이 발생, 반드시 따옴표를 제거 할 필요없이이 일을하는 방법이있다 ?

평범한 오래된 루비가 아니기 때문에 레일에 들어있는 .html_safe을 가지고 있지 않습니다 (어쨌든 작동하는지 여부는 확실하지 않습니다).

+0

비 ASCII 문자를 제거하면 결과 텍스트를 읽을 수 없게 만들거나 의미가없는 텍스트로 만들 수 있습니다. 그 의미를 지켜야합니까? ASCII가 아닌 모든 문자를 안전한 것으로 바꾸는 HTML 인코딩을 사용할 수 있지만 필요한 경우 값을 복구 할 수 있습니다. –

답변

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)을 사용하고 따옴표를 제거하는 것입니다 (꼭해야하는 경우).

관련 문제