2009-06-17 16 views
159

Sono consapevole che uno + nella stringa di query di un URL rappresenta uno spazio. Questo è anche il caso al di fuori della regione stringa di query? Vale a dire, fa il seguente URL:URL e segni più

http://a.com/a+b/c 

effettivamente rappresentano:

http://a.com/a b/c 

(e devono quindi essere codificato se deve essere effettivamente un +), o fa in realtà effettivamente rappresentano a+b/c?

+0

http://www.w3schools.com/tags/ref_urlencode. asp –

+4

Nota che in php urldecode decodifica% 2b (codificato +) in uno spazio. Per evitare questo uso 'rawurldecode'. Dico questo qui per riferimento perché questo è un risultato di alto valore su google cerca "interruzioni di decodifica php url sul simbolo più". – danielson317

+1

Possibile duplicato di [Quando codificare lo spazio su più (+) o% 20?] (Http://stackoverflow.com/questions/2678551/when-to-encode-space-to-plus-or-20) – user

risposta

136
  • Percent codifica nella sezione percorso di un URL dovrebbe essere decodificato, ma
  • eventuali + caratteri nel componente del percorso è dovrebbe essere trattato alla lettera

Per essere esplicito: + è solo un carattere speciale nel componente di query.

+5

+1 Sfortunatamente, molti "codificatori/codificatori di URL" là fuori in natura non lo capiscono. Per esempio http://www.sislands.com/coin70/week6/encoder.htm http://www.keyone.co.uk/tools-url-encoder.asp http://meyerweb.com/eric/tools/dencoder/ – leonbloy

+6

@Stobor: citazione necessaria. – bukzor

+5

@Stobor La RFC ha mai dichiarato che il carattere '+' è interpretato come uno spazio nel componente di query? O è semplicemente una regola "dal selvaggio"? – Pacerier

-3

Sempre codifichi gli URL.

Ecco come Rubino codifica l'URL:

irb(main):008:0> CGI.escape "a.com/a+b" 
=> "a.com%2Fa%2Bb" 
+0

Spiacente , permettimi di chiarire leggermente. Se l'utente digita "http://a.com/a+b/", questo deve essere interpretato come un% 20b e non un% 2Bb? –

+8

Non sono sicuro che sia giusto. Secondo RFC2396 (http://www.ietf.org/rfc/rfc2396.txt) i pluss non sono caratteri riservati nel percorso (segmenti) dell'URI, solo il componente di query. Ciò sembra implicare che non è necessario che siano codificati come URL e quindi non dovrebbero essere interpretati come spazi nel percorso, solo nella query. – tlrobinson

+0

Ah okay. Sarebbe un% 2Bb! –

158

potete trovare una bella lista di corrispondenti caratteri URL codificato sul W3Schools.

  • + diventa %2B
  • spazio diventa %20
+13

È perfettamente legale che i caratteri "+" letterali appaiano nel componente * path * su un URL. –

+1

Per ottenere un letterale + da ricevere dal back-end (o, almeno PHP) deve essere codificato tripla: '% 25252B' – Umbrella

+2

Questa risposta è completamente irrilevante alla domanda. –

-3

Prova di seguito: la funzione encodeURIComponent

<script type="text/javascript"> 

function resetPassword() { 
    url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char); 
} 
function fixEscape(str) 
{ 
    return escape(str).replace("+", "%2B"); 
} 
</script> 
+2

Trovo molto strano che due persone abbiano votato questa risposta. Letteralmente non ha nulla a che fare con la domanda. –

+1

Che ne dici di altri caratteri * @ - _ +./ – Ravi

+0

@AndrewBarber Perché l'hai trovato irrilevante? + diventa% 2B –

2

usano principalmente per fissare url, funziona su browser e Node.js

res.redirect("/signin?email="+encodeURIComponent("[email protected]")); 


> encodeURIComponent("http://a.com/a+b/c") 
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc' 
12

caratteri spaziali possono essere codificati solo come "+" in un contesto: coppie chiave-valore application/x-www-form-urlencoded.

RFC-1866 (specifica HTML 2.0), paragrafo 8.2.1. il paragrafo 1. dice: "I nomi e i valori dei campi del modulo sono sottoposti a escape: i caratteri dello spazio sono sostituiti da" + ", quindi i caratteri riservati sono sfuggiti").

Ecco un esempio di tale stringa nell'URL in cui RFC-1866 consente di codificare gli spazi come vantaggi: "http://example.com/over/there?name=foo+bar". Quindi, solo dopo "?", Gli spazi possono essere sostituiti da punti positivi (negli altri casi, gli spazi devono essere codificati in% 20). Questo modo di codificare i dati del modulo viene anche fornito nelle specifiche HTML successive, ad esempio, cercare i paragrafi pertinenti su application/x-www-form-urlencoded nella specifica HTML 4.01 e così via.

Tuttavia, poiché è difficile determinare sempre correttamente il contesto, è consigliabile non codificare mai spazi come "+". È meglio codificare per percentuale tutti i caratteri tranne "senza riserva" definiti in RFC-3986, p.2.3. Ecco un esempio di codice che illustra ciò che dovrebbe essere codificato.E 'dato in Delphi (Pascal) linguaggio di programmazione, ma è molto facile da capire come funziona per qualsiasi programmatore indipendentemente dalla lingua posseduta:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *) 
function UrlEncodeRfcA(const S: AnsiString): AnsiString; 
const  
    HexCharArrA: array [0..15] of AnsiChar = 'ABCDEF'; 
var 
    I: Integer; 
    c: AnsiChar; 
begin 
// percent-encoding, see RFC-3986, p. 2.1 
    Result := S; 
    for I := Length(S) downto 1 do 
    begin 
    c := S[I]; 
    case c of 
     'A' .. 'Z', 'a' .. 'z', // alpha 
     '0' .. '9',    // digit 
     '-', '.', '_', '~':; // rest of unreserved characters as defined in the RFC-3986, p.2.3 
     else 
     begin 
      Result[I] := '%'; 
      Insert('00', Result, I + 1); 
      Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)]; 
      Result[I + 2] := HexCharArrA[Byte(C) and $F]; 
     end; 
    end; 
    end; 
end; 

function UrlEncodeRfcW(const S: UnicodeString): AnsiString; 
begin 
    Result := UrlEncodeRfcA(Utf8Encode(S)); 
end; 
Problemi correlati