2011-01-27 3 views
27

Ho un testo di query che viene codificato con JavaScript, ma ho riscontrato un caso d'uso in cui potrei dover codificare lo stesso testo sul lato server, e la codifica che sta accadendo non è la stesso. Ho bisogno che sia uguale. Ecco un esempio.Url codifica di virgolette e spazi

Inserisco "I like food" nella casella di ricerca e premo il pulsante search. JavaScript lo codifica come %22I%20like%20food%22

Diciamo che ottengo lo stesso valore di una stringa su un oggetto richiesta sul lato server. Assomiglierà a questo: "\"I like food\""

Quando uso HttpUtility.UrlEncode(value), il risultato è "%22I+like+food%22". Se uso HttpUtility.UrlPathEncode(value), il risultato è "\"I%20like%20food\""

Quindi UrlEncode è la codifica mie citazioni, ma utilizza il carattere + per gli spazi. UrlPathEncode sta codificando i miei spazi ma non codifica le mie virgolette di escape.

Ho davvero bisogno di fare entrambe le cose, altrimenti il ​​codice di ricerca è completamente su di me (e non ho controllo sul codice di ricerca).

Suggerimenti?

+2

Eseguire una ricerca/sostituzione di stringa per sostituire gli spazi con% 20, quindi eseguire il normale UrlEncode? –

+1

@Marc B: non renderebbe UrlEncode codificare i caratteri "%" (risultando in% 2520 per ogni spazio)? Comportamento molto strano di UrlPathEncode. Almeno UrlEncode documenta la sua conversione da spazi a "+". UrlPathEncode non sa niente sulla conversione di citazioni ... –

+1

Hmm. buon punto. Immagino che potresti andare dall'altra parte, prima UrlEncode, poi cercare/sostituire + con% 20's –

risposta

51

UrlPathEncode non sfugge " perché non hanno bisogno di essere sfuggito a componenti del percorso.

Uri.EscapeDataString dovrebbe fare quello che vuoi.

+2

Grazie! Strano che poche persone lo sappiano. – Samo

+1

Sono d'accordo. Vorrei che l'uso/conoscenza di Uri.EscapeDataPath fosse più diffuso, in quanto questo era esattamente ciò di cui avevo bisogno. –

9

Ci sono alcune opzioni disponibili, la più veloce potrebbe essere quella di usare UrlEncode, quindi fare un string.replace per scambiare i caratteri + con %20.

Qualcosa di simile

HttpUtility.UrlEncode(input).Replace("+", "%20"); 
+0

Grazie. Ho considerato l'opzione di sostituzione delle stringhe, ma speravo che esistesse un metodo che funzionasse correttamente. Sembra che dovrò ricorrere a questo però. Certo, hai detto che ci sono alcune opzioni e ne hai elencato solo una ... Sarei interessato a vedere gli altri. Grazie! – Samo

+1

Ho trovato utile System.Web.HttpUtility.UrlPathEncode (string str); per dare% 20 per lo spazio – Jivan

+1

Non mi piace affatto questa soluzione .. la sostituzione di "+" con "% 20" risolverà i problemi se il testo contiene degli spazi, ma creerà altri problemi se il testo ha "+" !! ! –

-1
WebUtility.UrlEncode(str) 

codificherà tutti i caratteri che devono codificati utilizzando il formato %XX, incluso lo spazio.

+3

Questo è semplicemente sbagliato e quindi fuorviante. 'WebUtility.UrlEncode' trasforma uno spazio in un '+' – Coops

+2

Nota: questa risposta è stata contrassegnata e successivamente è stata inserita in una [coda di revisione] (http://stackoverflow.com/review/low-quality-posts/16071767). Non dovrebbe essere stato contrassegnato poiché si tratta di un tentativo di rispondere alla domanda. La risposta alle risposte sbagliate è downvote, non flag. –