2012-02-16 9 views
14

Come codificare correttamente un percorso che include un hash (#)? Nota che l'hash non è l'indicatore del frammento (segnalibro?) Ma parte del nome del percorso.Come codificare un percorso che contiene un hash?

Per esempio, se c'è un percorso come questo:

http://www.contoso.com/code/c#/somecode.cs

provoca problemi quando si per esempio provare esegue questa operazione:

Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs"); 

Sembrerebbe che interpreta l'hash come l'indicatore del frammento.

È sbagliato sostituire manualmente # con% 23. Ci sono altri personaggi che dovrebbero essere sostituiti? Ci sono alcuni metodi di escape in Uri e HttpUtility, ma nessuno sembra fare il trucco.

risposta

3

fatto un po 'più amici scavo trovato una domanda duplicata per Java: HTTP URL Address Encoding in Java

Tuttavia, la classe .Net Uri non offre il costruttore di cui abbiamo bisogno, ma lo strumento UriBuilder fa.

Così, al fine di costruire una vera e propria URI in cui il percorso contiene caratteri non validi, fare questo:

// Build Uri by explicitly specifying the constituent parts. This way, the hash is not confused with fragment identifier 
UriBuilder uriBuilder = new UriBuilder("http", "www.contoso.com", 80, "/code/c#/somecode.cs"); 

Debug.WriteLine(uriBuilder.Uri); 
// This outputs: http://www.contoso.com/code/c%23/somecode.cs 

Notate come lo fa non inutilmente sfuggire parti del URI che non hanno bisogno di fuggire (come il: // parte) che è il caso di HttpUtility.UrlEncode. Sembrerebbe che lo scopo di questa classe sia in realtà quello di codificare la parte querystring/frammento dell'URL, non lo schema o il nome host.

1

Uso UrlEncode: System.Web.HttpUtility.UrlEncode(string)

class Program 
{ 
    static void Main(string[] args) 
    { 
     string url = "http://www.contoso.com/code/c#/somecode.cs"; 
     string enc = HttpUtility.UrlEncode(url); 

     Console.WriteLine("Original: {0} ... Encoded {1}", url, enc); 
     Console.ReadLine(); 
    } 
} 
+0

La stringa enc nell'esempio, sebbene con escape, non è più un URI valido. Prova Uri uri = nuovo Uri (enc) e vedrai che genera un'eccezione URI non valida. Trovato la soluzione corretta però. – Dodgyrabbit

+0

Interessante. Sono un po 'confuso dalla documentazione MSDN, quindi, che dice _Encodes una stringa URL. Il metodo UrlEncode può essere utilizzato per codificare l'intero URL, inclusi i valori stringa di query._ (vedere http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx) – LiquidPony

3

Ci sono alcuni caratteri che non si dovrebbe usare. Puoi provare a work your way through this very dry documentation o fare riferimento a questo handy URL summary on Stack Overflow.

Se verifichi questo sito Web, vedrai che le loro domande C# sono codificate %23.

Stack Overflow C# Questions

È possibile farlo utilizzando (per ASP.NET):

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    Server.UrlEncode("c#") 
); 

o per le librerie di classi/desktop:

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    HttpUtility.UrlEncode("c#") 
); 
+0

Collegamento Nice .. C# senza codifica! Buon trucco! –

+0

Nota che la codifica dell'intero URL in questo modo (inclusi schema e percorso) produce effettivamente una stringa che non è un URI valido. Genera URI non valido: il formato dell'URI non può essere determinato se provi a costruire un URI da esso. – Dodgyrabbit

+0

Sì abbastanza - esempi aggiornati. – Fenton

Problemi correlati