Nézzük meg a következő két URL-t, ugyanazokat a paramétereket adják át? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Úgy tűnik, más, de valójában mind UrlEncode-ot használnak ".net technológiához", de az egyik GB2312 kódolás, a másik Utf-8 kódolás. A következő kód képes elérni a fenti kódolási hatást:
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);
A valódi weboldalainkat más programok is hívhatják meg. Például a Chinese Simplified (Chinese Simplified segítségével) egy operációs rendszer ASP oldalának kínai paramétert kell átadnia egy ASP.net oldalra. Alapértelmezés szerint a kínai egyszerűsített operációs rendszereken az ASP Server.UrlEncode módszere GB2312 kódolással kódolja a kínai nyelvet. De alapértelmezés szerint ASP.net oldalak UTF-8-ban vannak kódolva. Ebben az esetben, amikor az érték elfogadásához használja az Request.QueryString["Tag"] funkciót, nem tudsz kínai információt elfogadni, és lépésről lépésre hibázott karaktereket fogsz látni. Jelenleg bár az Request.QueryString["Tag"] elfogadható zavaros karakterekkel, az URL jelenleg nem zavaros.
A megoldás az, hogy magad elemezed az URL-ben lévő paramétereket, majd a GB2312 kódolása szerint dekódolod a paraméterek értékeit, ahelyett, hogy a .net alapértelmezett UTF-8 kódolását használnád. Valójában a Microsoft hasonló funkciókat kínál, így nem kell rendszeres kifejezéseket használnunk az URL-láncok elemzéséhez.
A demográfiai kód a következő:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Használjuk Lutz Roeder .NET Reflector-ját a System.Web.HttpUtility.ParseQueryString módszer megvalósításához: Ha folyamatosan visszanézünk, láthatjuk, hogy a kód, amely végül kezeli az URL paraméter string elemzést, a következő:
A System.Web.HttpValueCollection osztály következő funkciója valósítja meg az URL paraméter elemzését Itt azt látjuk, hogy minden karakter által végzett elemzés.
Ami azt illeti, hogy a másik fél milyen kódolási módszert ad nekünk, a legjobb, ha paraméterként adjuk át, hogy a felhasználó paramétere szerint tudjuk dekódolni. |