Давайте розглянемо наступні два URL-адреси, чи передають вони ті самі параметри? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Здається, це інакше, але насправді всі вони використовують UrlEncode для «.net технології», але одне — це кодування GB2312, а інше — Utf-8. Наступний код може отримати наведений вище ефект кодування:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); рядок tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Наші фактичні веб-сторінки можуть називатися іншими програмами. Наприклад, китайська спрощена сторінка ASP в операційній системі повинна передати китайський параметр на сторінку ASP.net. За замовчуванням на китайських спрощених операційних системах метод Server.UrlEncode від ASP кодуватиме китайську мову за допомогою GB2312. Але за замовчуванням ASP.net сторінки кодуються в UTF-8. У цьому випадку, коли ви використовуєте Request.QueryString["Tag"] для прийняття значення, ви не зможете приймати китайську інформацію і побачите спотворені символи у покроковому відлагодженні. На даний момент, хоча Request.QueryString["Tag"] приймається з спотвореними символами, URL наразі не спотворений.
Рішення полягає в тому, щоб самостійно проаналізувати параметри в URL, а потім розшифрувати значення параметрів відповідно до кодування GB2312, замість використання стандартного UTF-8 кодування .net. Насправді, Microsoft також надає відповідні функції, тож нам не потрібно самостійно використовувати регулярні вирази для аналізу рядків URL.
Демо-код виглядає так:
рядок q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Тег"]);
Давайте використаємо .NET Reflector Lutz Roeder, щоб розглянути реалізацію методу System.Web.HttpUtility.ParseQueryString: Якщо ми продовжуємо перевіряти, то побачимо, що код, який нарешті обробляє аналіз рядків параметрів URL, виглядає так:
Наступна функція класу System.Web.HttpValueCollection реалізує розбір параметра URL Тут ми бачимо, що це аналіз, який проводить кожен персонаж.
Щодо того, який метод кодування інша сторона передає нам, найкраще передати його як параметр, щоб ми могли розшифрувати за цим параметром користувача. |