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.
- internal void FillFromString(string s, bool urlencoded, Encoding encoding)
- {
- int num1 = (s != null) ? s.Length : 0;
- for (int num2 = 0; num2 < num1; num2++)
- {
- int num3 = num2;
- int num4 = -1;
- while (num2 < num1)
- {
- switch (s[num2])
- {
- case ’=’:
- if (num4 < 0)
- {
- num4 = num2;
- }
- break;
- }
- num2++;
- }
- string text1 = null;
- string text2 = null;
- if (num4 >= 0)
- {
- text1 = s.Substring(num3, num4 - num3);
- text2 = s.Substring(num4 + 1, (num2 - num4) - 1);
- }
- else
- {
- text2 = s.Substring(num3, num2 - num3);
- }
- if (urlencoded)
- {
- base.Add(HttpUtility.UrlDecode(text1, encoding), HttpUtility.UrlDecode(text2, encoding));
- }
- else
- {
- base.Add(text1, text2);
- }
- if ((num2 == (num1 - 1)) && (s[num2] == ’&’))
- {
- base.Add(null, string.Empty);
- }
- }
- }
Copia codice
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. |