2014-11-06 14 views
11

Quando si utilizza HttpUtility da System.Web, trovo che ogni volta chiamo il metodo .ParseQueryString Sto avendo caratteri speciali codificati per le loro rappresentazioni equivalenti unicode. Ho provato con molti tipi di codifica diversi e tutti sembrano produrre lo stesso risultato. Un esempio del mio codice è qui:HttpUtility.ParseQueryString() codifica sempre caratteri speciali per unicode

string text = "ich möchte diese Bild für andere freigeben" 
var urlBuilder = new UriBuilder(url); 
var query = HttpUtility.ParseQueryString(urlBuilder.Query, Encoding.UTF8); 
query["text"] = text;  
urlBuilder.Query = query.ToString(); 
string finalUrl = urlBuilder.ToString(); 

e la stringa in finalUrl che avrei ricevo da questo sarebbe:

text = ich + m% u00f6chte + diese + Bild + f% u00fcr + + andere freigeben

ho provato con Encoding.UTF8, e Encoding.Default e tutti producono lo stesso risultato. Che cosa posso fare per raggiungere il mio formato desiderato di urlencoding:

text = ich% 20m% C3% B6chte% 20diese% 20Bild% 20f% C3% BCR% 20andere% 20freigeben

Come sempre, Grazie in anticipo per l'aiuto/consigli!

+0

cosa consiglieresti? – tezromania

+0

Proprio come una nota a margine, potresti volerli mostrare come non codificati, ma le specifiche dell'URL indicano chiaramente che questi dovrebbero essere codificati. https://www.ietf.org/rfc/rfc1738.txt (attorno al marcatore di pagina 2) – Nathan

+0

Non è che non voglio codificarli, è che voglio che venga visualizzato come codifica url standard vs codifica unicode. – tezromania

risposta

1

Non ho familiarità con ParseQueryString, ma viene visualizzato dalla documentazione per convertire una query correttamente formattata in coppie di valori nominali. Dal tuo post sembra che tu stia cercando di fare il contrario: converti coppie di dati in una query formattata correttamente. Invece si può provare a utilizzare HttpUtility.UrlEncode

string text = "ich möchte diese Bild für andere freigeben" 
var urlBuilder = new UriBuilder(url); 
String query = "text=" + HttpUtility.UrlEncode(text); 
urlBuilder.Query = query; 
string finalUrl = urlBuilder.ToString(); 
13

Il problema è in:

urlBuilder.Query = query.ToString(); 

HttpUtility.ParseQueryString restituisce un NameValueCollection ma in realtà è una classe interna denominata HttpValueCollection. Questa classe ha un override del metodo ToString(). Genera una stringa di query codificata ma per la codifica URL utilizza HttpUtility.UrlEncodeUnicode (tinyurl.com/HttpValue). Ciò comporta i valori% uXXXX.

Se avete bisogno di un diverso tipo di codifica URL che si potrebbe voler evitare HttpUtility.ParseQueryString o decodificare il risultato di ToString() e codificarlo in seguito:

urlBuilder.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString())); 
5

Questa domanda è un po 'vecchia, ma ho appena imbattuto mentre ricercando questo problema e notato che manca una risposta valida.

La correzione è abbastanza semplice, in web.config basta aggiungere la seguente impostazione (testato e funziona in .NET 4.5):

<appSettings> 
    <add key="aspnet:DontUsePercentUUrlEncoding" value="true" /> 
</appSettings> 

L'impostazione di questo valore su True controlla il modo in .NET codificherà alcuni caratteri nel URL. Specificamente caratteri come ä, ë, ö ecc. Penso che questo potrebbe essere dovuto al fatto che ci sono molti modi in cui questi personaggi possono essere codificati. Il modo in cui questo viene generalmente fatto è con il prefisso %C3 che indica che il seguente carattere ha una dieresi (sono abbastanza sicuro che sia così che funziona).

Il modo in cui lo è HttpUtility.ParseQueryString è diverso. Codifica il carattere con il carattere unicode codificato in percentuale effettiva %u00f6. Questo può causare alcuni problemi perché non è l'impostazione predefinita nemmeno all'interno.NET stesso, per esempio, HttpUtility.UrlEncode lo codificherà su %C3%B6. La modifica dell'impostazione precedente assicurerà che entrambi i metodi restituiscano risultati simili.