def escape(s)
s.inspect[1..-2]
end
def unescape(s)
eval %Q{"#{s}"}
end
더 나은 방법이 있나요?
여러 가지 탈출이라니요 방법, 그들 중 일부는:
# Regexp escapings
>> Regexp.escape('\*?{}.')
=> \\\*\?\{\}\.
>> URI.escape("test=100%")
=> "test=100%25"
>> CGI.escape("test=100%")
=> "test%3D100%25"
그렇다면 그 문제를 해결하는 데 필요한 상행담관염이라고 달려 있다. 하지만 난 탈출이라니요 검사 사용하지 마십시오.
It looks like it 업데이트하십시오 덤프합니다 있습니다, 검사 및 사용하는 것이 필요합니다.
>> "\n\t".dump
=> "\"\\n\\t\""
당시 케일럽이요 기능을 하는 게 가장 가까운 역동기화에 String # 검사, 하지만 나는 이 두 가지 버그를 발견할 수 있었다.
*\\ 제대로 처리됩니까 않았다.
위 벅스, 이는 내가 고정식입니다 업데이트된 버전:
UNESCAPES = {
'a' => "\x07", 'b' => "\x08", 't' => "\x09",
'n' => "\x0a", 'v' => "\x0b", 'f' => "\x0c",
'r' => "\x0d", 'e' => "\x1b", "\\\\" => "\x5c",
"\"" => "\x22", "'" => "\x27"
}
def unescape(str)
# Escape all the things
str.gsub(/\\(?:([#{UNESCAPES.keys.join}])|u([\da-fA-F]{4}))|\\0?x([\da-fA-F]{2})/) {
if $1
if $1 == '\\' then '\\' else UNESCAPES[$1] end
elsif $2 # escape \u0000 unicode
["#$2".hex].pack('U*')
elsif $3 # escape \0xff or \xff
[$3].pack('H2')
end
}
end
# To test it
while true
line = STDIN.gets
puts unescape(line)
end
Update: 하지만 이젠 더 이상 내 스스로 답을 동의하지 않을 수 있기 때문에 다시 삭제하시겠습니까 I&; d # 39 포지셔닝하십시오 하는 의심이 go down 이 잘못된 길로, 그리고 다른 많은 there& # 39 에 이미 이 질문에 대한 논의 및 it& # 39 의 대안, 그런 만큼 여전히 대화를 하는 있지만, 실제 코드를 사용하여 desktopplatforms don& # 39 이 대답이 없다.
하지만 '평가' 를 사용할 경우, t # 39 don& 사용할 의향이 있다 ',' 모듈에서는 YAML 대신 사용할 수 있습니다.
<! - 언어: 루비 - >.
require 'yaml'
def unescape(s)
YAML.load(%Q(---\n"#{s}"\n))
end
'평가' 를 통해 '수' YAML 것이 안전한 것으로 추정된다. '모든' 평가 '' 지팡이를 사용할 수 없도록 하고. # 39, i& 사용할 수 있지만, '평가' 안전 've seen 권장안을' $ 함께 사용할 수 없는 제러비 통해 현재.
뭐하러요 만하다, 파이썬 없는 기본으로 지원하는 [어니스카핑 백 슬래시] (https://stackoverflow.com/questions/1885181/how-do-i-un-escape-a-backslash-escaped-string-in-python).
"a\nb".inspect
=> "\"a\\nb\""
일반적으로, 만약 우리가 문자열으로 인쇄하십시오 내장된 줄 바꿈 we& # 39; d 프레젠테이션이든:
puts "a\nb"
a
b
만약 우리가 모두 인쇄인쇄 버전:
puts "a\nb".inspect
"a\nb"
'평가' 를 명령취소할 탈출이라니요, 문자열.
puts eval("a\nb".inspect)
a
b
내가 지금 이렇게 don& # 39, t really like. # 39 에 비해 더 많은 호기심을 it& I& # 39; d 해야 할 일이 뭔가 "라고 언급하였다.
확실히 '평가' 를 사용하지 않는 임의의 또는 클라이언트 제공 데이터.
이것이 내가 사용합니다. # 39, ve seen 및 doesn& I& 모든 것을 처리하는 모든 # 39, t 소개하십시오 종속도.
UNESCAPES = {
'a' => "\x07", 'b' => "\x08", 't' => "\x09",
'n' => "\x0a", 'v' => "\x0b", 'f' => "\x0c",
'r' => "\x0d", 'e' => "\x1b", "\\\\" => "\x5c",
"\"" => "\x22", "'" => "\x27"
}
def unescape(str)
# Escape all the things
str.gsub(/\\(?:([#{UNESCAPES.keys.join}])|u([\da-fA-F]{4}))|\\0?x([\da-fA-F]{2})/) {
if $1
if $1 == '\\' then '\\' else UNESCAPES[$1] end
elsif $2 # escape \u0000 unicode
["#$2".hex].pack('U*')
elsif $3 # escape \0xff or \xff
[$3].pack('H2')
end
}
end
['문자열 # 운트럼프'] [1] 로 루비 2.5 추가되든지 보완하기 위해 ['문자열 # 덤프하지'] [2]:
$ irb
irb(main):001:0> dumped_newline = "\n".dump
=> "\"\\n\""
irb(main):002:0> undumped_newline = dumped_newline.undump
=> "\n"
이를 통해:
def escape(s)
s.dump[1..-2]
end
def unescape(s)
"\"#{s}\"".undump
end
$irb
irb(main):001:0> escape("\n \" \\")
=> "\\n \\\" \\\\"
irb(main):002:0> unescape("\\n \\\" \\\\")
=> "\n \" \\"
[1]: https://ruby-doc.org/core/String.html # 내가 운트럼프 방법 [2]: https://ruby-doc.org/core/String.html # 내가 덤프하지 방법