Apskatīsim šādus divus URL, vai tie nodod tos pašus parametrus? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Šķiet, ka tas ir atšķirīgs, bet patiesībā viņi visi izmanto UrlEncode ".net tehnoloģijai", bet viens ir GB2312 kodējums, bet otrs ir Utf-8 kodējums. Iepriekš minēto kodēšanas efektu var iegūt šāds kods:
virkne tmp1 = System.Web.HttpUtility.UrlEncode(".net tehnoloģija", System.Text.Encoding.GetEncoding("GB2312")); virkne tmp2 = System.Web.HttpUtility.UrlEncode(".net tehnoloģija", System.Text.Encoding.UTF8);
Mūsu faktiskās tīmekļa lapas var izsaukt citas programmas. Piemēram, ķīniešu vienkāršotā operētājsistēmas ASP lapai ir jānodod ķīniešu valodas parametrs ASP.net lapai. Pēc noklusējuma ķīniešu vienkāršotajās operētājsistēmās ASP Server.UrlEncode metode kodēs ķīniešu valodu ar GB2312 kodējumu. Bet pēc noklusējuma ASP.net lapas ir kodētas UTF-8. Šādā gadījumā, izmantojot Request.QueryString["Tag"], lai akceptētu vērtību, jūs nevarēsit pieņemt ķīniešu valodas informāciju, un detalizētā atkļūdošanā redzēsit izkropļotas rakstzīmes. Šobrīd, lai gan Request.QueryString["Tag"] tiek akceptēts ar izkropļotām rakstzīmēm, URL šobrīd nav izkropļots.
Risinājums ir analizēt URL parametrus un pēc tam atšifrēt parametru vērtības saskaņā ar GB2312 kodējumu, nevis izmantot .net noklusējuma UTF-8 kodējumu. Patiesībā Microsoft līdzīgi nodrošina atbilstošas funkcijas, tāpēc mums pašiem nav jāizmanto regulārās izteiksmes, lai analizētu URL virknes.
Demonstrācijas kods ir šāds:
virkne q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Izmantosim Lutz Roeder .NET reflektoru, lai aplūkotu System.Web.HttpUtility.ParseQueryString metodes ieviešanu: Ja mēs turpinām pārbaudīt, mēs varam redzēt, ka kods, kas beidzot apstrādā URL parametru virknes analīzi, ir šāds:
Šāda System.Web.HttpValueCollection klases funkcija īsteno URL parametra parsēšanu Šeit mēs redzam, ka tā ir katra varoņa veiktā analīze.
Attiecībā uz to, kāda veida kodēšanas metodi otra puse nodod mums, vislabāk to nodot kā parametru, lai mēs to varētu atšifrēt saskaņā ar šo lietotāja parametru. |