автоматическое декодирование URI по мере необходимости

a = 'some string'
b = URI.encode(a) # returns 'some%20string'
c = URI.encode(b) # returns 'some%2520string'

есть ли способ в рубине, с помощью которого я могу декодировать 'c', который приводит меня к строке 'a' без двойного декодирования. Я хочу сказать, что у меня есть одна строка, которая кодируется дважды, а другая - один раз. Я хочу, чтобы метод автоматически декодировал обычную строку, автоматически определяя количество декодируемого времени.


person shankardevy    schedule 21.08.2013    source источник
comment
вы можете попробовать URI.escape и URI.unescape ruby- doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI/Escape.html   -  person Rajarshi Das    schedule 21.08.2013
comment
URI.unescape отменяет экранирование только один раз. Я хочу отключить экранирование столько раз, сколько было закодировано.   -  person shankardevy    schedule 21.08.2013
comment
Вы не можете определить это автоматически.   -  person Stefan    schedule 21.08.2013


Ответы (3)


Я думаю, единственный способ добиться этого - продолжать декодирование, пока оно не перестанет вносить изменения. Я люблю такие вещи: do while loop:

decoded = encoded
begin
  decoded = URI.decode(decoded) 
end while(decoded != URI.decode(decoded)  )

ИМХО то, что вы ищете, не существует.

******** РЕДАКТИРОВАТЬ *************

Ответы на другой повторяющийся вопрос для этого в stackoverflow также предлагают тот же Как узнать, была ли строка уже закодирована URL-адресом?

person Sahil Dhankhar    schedule 21.08.2013

Я не могу найти автоопределение в документах, но его можно реализовать следующим образом с одним дополнительным вызовом #decode:

def decode_uri(uri)
  current_uri, uri = uri, URI.decode(uri) until uri == current_uri
  uri
end

который будет вызывать #decode на uri, пока не перестанет вносить в него какие-либо изменения.

person Nikita Chernov    schedule 21.08.2013

Это работает для меня:

def decode_uri(encoded)
  decoded = encoded
  begin
    decoded = URI.decode(decoded)
  end while(decoded != URI.decode(decoded))
  return decoded
end
person Teebu    schedule 24.01.2017