Нека разгледаме следващите два 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")); string 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 на Лутц Рьодер, за да разгледаме имплементацията на метода System.Web.HttpUtility.ParseQueryString: Ако продължим да проверяваме, можем да видим, че кодът, който най-накрая обработва анализа на низовете на параметъра на URL, е следният:
Следната функция на класа System.Web.HttpValueCollection реализира разбора на параметъра URL Тук виждаме, че това е анализ, извършен от всеки персонаж.
- 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);
- }
- }
- }
Копирай код
Що се отнася до това какъв метод за кодиране ни предава другата страна, най-добре е да го предадем като параметър, за да можем да го декриптираме според този параметър на потребителя. |