2012-11-12 6 views
9

Ho letto the documentation of url_encode.url_encode in Ruby

C'è una tabella che mi dice esattamente quale carattere è codificato per cosa, usando url_encode?

+1

E * dovrebbe * codificare tutti i caratteri * tranne * coloro che sono ammessi in [URL RFC# 1738] (http://www.ietf.org/ specifiche rfc/rfc1738.txt) e successive [URI RFC# 3986] (http://tools.ietf.org/html/rfc3986). Ci sono post SO che approfondiscono i dettagli; anche se 'url_encode' potrebbe avere delle stranezze (ad esempio, spesso' + 'potrebbe essere gestito in modo diverso a seconda del contesto). –

+1

Non codifica ogni carattere, solo quelli che sono limitati. –

risposta

10

ERB di url_encode possono essere modificati:

def url_encode(s) 
    s.to_s.dup.force_encoding("ASCII-8BIT").gsub(%r[^a-zA-Z0-9_\-.]/) { 
    sprintf("%%%02X", $&.unpack("C")[0]) 
    } 
end 

a:

def url_encode(s, regex=%r[^a-zA-Z0-9_\-.]/) 
    s.to_s.dup.force_encoding("ASCII-8BIT").gsub(regex) { 
    sprintf("%%%02X", $&.unpack("C")[0]) 
    } 
end 

url_encode('pop', /./) 
=> "%70%6F%70" 

Inoltre, i moduli CGI e URI di Ruby hanno la capacità di codificare gli URL, la conversione di caratteri limitati a soggetti, in modo da don' t trascurare le loro offerte.

Per esempio, in fuga caratteri per i parametri URL:

CGI.escape('http://www.example.com') 
=> "http%3A%2F%2Fwww.example.com" 

CGI.escape('<body><p>foo</p></body>') 
=> "%3Cbody%3E%3Cp%3Efoo%3C%2Fp%3E%3C%2Fbody%3E" 

di Ruby CGI escape utilizza anche un piccolo regex per capire quali caratteri devono essere sfuggiti in un URL. Questa è la definizione del metodo dalla documentazione:

def CGI::escape(string) 
    string.gsub(%r([^ a-zA-Z0-9_.-]+)/) do 
    '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase 
    end.tr(' ', '+') 
end 

È inoltre ignorare che e modificare la regex, e di esporlo per uso personale all'interno della vostra ridefinizione del metodo:

def CGI::escape(string, escape_regex=%r([^ a-zA-Z0-9_.-]+)/) 
    string.gsub(escape_regex) do 
    '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase 
    end.tr(' ', '+') 
end 

URI.encode_www_form_component fa anche un codifica simile, le uniche differenze nei caratteri sono * e :

URI.encode_www_form_component('<p>foo</p>') 
=> "%3Cp%3Efoo%3C%2Fp%3E" 

e, similmente a OV erriding CGI::escape, è possibile ignorare la regex in URI.encode_www_form_component:

def self.encode_www_form_component(str, regex=%r[^*\-.0-9A-Z_a-z]/) 
    str = str.to_s 
    if HTML5ASCIIINCOMPAT.include?(str.encoding) 
    str = str.encode(Encoding::UTF_8) 
    else 
    str = str.dup 
    end 
    str.force_encoding(Encoding::ASCII_8BIT) 
    str.gsub!(regex, TBLENCWWWCOMP_) 
    str.force_encoding(Encoding::US_ASCII) 
end