2013-08-21 3 views
2
a = 'some string' 
b = URI.encode(a) # returns 'some%20string' 
c = URI.encode(b) # returns 'some%2520string' 

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

+0

вы можете попробовать '' URI.escape' и URI.unescape' http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI/ Escape.html –

+0

URI.unescape только unescapes один раз. Я хочу unescape столько времени, сколько было закодировано. – shankardevy

+1

Вы не можете определить это автоматически. – Stefan

ответ

9

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

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

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

******** EDIT *************

Ответы другого дублированного вопроса для этого на StackOverflow также предлагает тот же How to find out if string has already been URL encoded?

2

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

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

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

0

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

def decode_uri(encoded) 
    decoded = encoded 
    begin 
    decoded = URI.decode(decoded) 
    end while(decoded != URI.decode(decoded)) 
    return decoded 
end 
Смежные вопросы