Să aruncăm o privire la următoarele două URL-uri, acestea îndeplinesc aceiași parametri? aaa.aspx?tag=.net%BC%BC%CA%F5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Pare diferit, dar de fapt toate folosesc UrlEncode pentru "tehnologia .net", însă una este codificare GB2312 și cealaltă codare Utf-8. Următorul cod poate obține efectul de codare de mai sus:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); string tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Paginile noastre web pot fi accesate de alte programe. De exemplu, o pagină ASP simplificată în chineză din sistemul de operare trebuie să transmită un parametru chinezesc către o pagină ASP.net. Implicit, pe sistemele de operare chinezești simplificate, metoda Server.UrlEncode a ASP va codifica chineza cu codare GB2312. Dar, implicit, paginile ASP.net sunt codificate în UTF-8. În acest caz, când folosești Request.QueryString["Tag"] pentru a accepta valoarea, nu vei putea accepta informații chinezești și vei vedea caractere distorsionate în depanarea pas cu pas. În acest moment, deși Request.QueryString["Tag"] este acceptat cu caractere distorsionate, URL-ul în acest moment nu este distorsionat.
Soluția este să analizezi singur parametrii din URL, apoi să decriptezi valorile parametrilor conform codării GB2312, în loc să folosești codarea implicită UTF-8 a .net. De fapt, Microsoft oferă în mod similar funcții corespunzătoare, astfel încât nu trebuie să folosim expresii regulate pentru a analiza noi înșine șirurile de URL-uri.
Codul demo este următorul:
șirul q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Răspuns.Scrie(nv["Etichetă"]);
Să folosim .NET Reflector al lui Lutz Roeder pentru a analiza implementarea metodei System.Web.HttpUtility.ParseQueryString: Dacă verificăm mereu, putem vedea că codul care gestionează în cele din urmă analiza șirurilor parametrilor URL este următorul:
Următoarea funcție a clasei System.Web.HttpValueCollection implementează analizarea parametrului URL Aici vedem că este o analiză realizată de fiecare personaj.
În ceea ce privește tipul de metodă de codare pe care cealaltă parte ne-o transmite, cel mai bine este să o transmitem ca parametru, astfel încât să o putem decripta conform acestui parametru al utilizatorului. |