Aşağıdaki iki URL'ye bakalım, aynı parametreleri mi geçiriyorlar? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Farklı görünüyor, ama aslında hepsi ".net teknolojisi" için UrlEncode kullanıyor, biri GB2312 kodlaması, diğeri ise Utf-8 kodlaması. Aşağıdaki kod yukarıdaki kodlama etkinini elde edebilir:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); tmp2 dizisi = System.Web.HttpUtility.UrlEncode(".net teknolojisi", System.Text.Encoding.UTF8);
Gerçek web sayfalarımız diğer programlar tarafından çağrılabilir. Örneğin, Çince basitleştirilmiş bir işletim sistemindeki ASP sayfası, Çince bir parametreyi ASP.net sayfasına aktarmak zorundadır. Varsayılan olarak, Çin basitleştirilmiş işletim sistemlerinde, ASP'nin Server.UrlEncode yöntemi Çince'yi GB2312 kodlama ile kodlar. Ancak varsayılan olarak, ASP.net sayfalar UTF-8 ile kodlanır. Bu durumda, değeri kabul etmek için Request.QueryString["Tag"] kullandığınızda, Çince bilgisini kabul edemezsiniz ve adım adım hata ayıklama sırasında bozuk karakterler göreceksiniz. Şu anda, Request.QueryString["Tag"] bozuk karakterlerle kabul edilse de, URL bu anda bozuk değildir.
Çözüm, URL'deki parametreleri kendiniz analiz etmek ve ardından parametrelerin değerlerini GB2312 kodlamasına göre çözmek, .net'in varsayılan UTF-8 kodlamasını kullanmak yerine. Aslında, Microsoft da benzer şekilde karşılık gelen fonksiyonlar sağlıyor, böylece URL dizelerini analiz etmek için düzenli ifadeler kullanmak zorunda kalmıyoruz.
Demo kodu şöyledir:
q dizisi = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Lutz Roeder'in .NET Reflector'ını kullanarak System.Web.HttpUtility.ParseQueryString yönteminin uygulanışına bakalım: Sürekli kontrol edersek, URL parametre dizisi analizini nihayet yöneten kodun şu olduğunu görebiliriz:
System.Web.HttpValueCollection sınıfının aşağıdaki fonksiyonu, URL parametresinin ayrıştırmasını uygular Burada her karakter tarafından yapılan bir analiz olduğunu görüyoruz.
Diğer tarafın bize ne tür bir kodlama yöntemi vereceği konusunda, bunu bir parametre olarak vermek en iyisidir, böylece kullanıcının bu parametresine göre şifresini çözebiliriz. |