Diamo un'occhiata ai seguenti due URL, soddisfano gli stessi parametri? aaa.aspx?tag=.net%BC%BC%CA%F5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Sembra diverso, ma in realtà tutti usano UrlEncode per la "tecnologia .net", mentre uno è la codifica GB2312 e l'altro la codifica Utf-8. Il seguente codice può ottenere l'effetto di codifica sopra:
stringa tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); stringa tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Le nostre pagine web possono essere chiamate da altri programmi. Ad esempio, una pagina ASP semplificata in cinese nel sistema operativo deve passare un parametro cinese a una pagina ASP.net. Di default, sui sistemi operativi semplificati cinesi, il metodo Server.UrlEncode di ASP codifica cinese con la codifica GB2312. Ma di default, ASP.net pagine sono codificate in UTF-8. In questo caso, quando usi Request.QueryString["Tag"] per accettare il valore, non potrai accettare informazioni cinesi e vedrai caratteri distorti nel debug passo dopo passo. Al momento, sebbene Request.QueryString["Tag"] sia accettato con caratteri distorti, l'URL al momento non è distorto.
La soluzione è analizzare i parametri nell'URL da solo, e poi decifrare i valori dei parametri secondo la codifica di GB2312, invece di usare la codifica predefinita UTF-8 di .net. Infatti, Microsoft fornisce analogamente funzioni corrispondenti, quindi non dobbiamo usare espressioni regolari per analizzare noi le stringhe URL.
Il codice demo è il seguente:
stringa q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Risposta.Scrivi(nv["Tag"]);
Usiamo il .NET Reflector di Lutz Roeder per esaminare l'implementazione del metodo System.Web.HttpUtility.ParseQueryString: Se continuiamo a controllare, possiamo vedere che il codice che finalmente gestisce l'analisi delle stringhe dei parametri URL è il seguente:
La seguente funzione della classe System.Web.HttpValueCollection implementa l'analisi del parametro URL Qui vediamo che si tratta di un'analisi condotta da ciascun personaggio.
Per quanto riguarda il tipo di metodo di codifica che l'altra parte ci passa, è meglio passarlo come parametro, così da poterlo decifrare secondo questo parametro dell'utente. |