Bu sabah bir meslektaşım bana bir soru sordu: Alınan parametrelerin karıştığını söyledim, sorunu çözmeme yardım edeyim.
Meslektaşımın sorumlu olduğu platform Ext.js çerçeve oluşturulmuş ve web.config yapılandırma dosyası küresel "GB2312" kodlamasıyla yapılandırılmıştır:
<küreselleşme istekliKodlama="gb2312" yanıtıKodlama="gb2312" dosyaKodlama="gb2312" kültür="zh-CN"/>
Ön uç "Çince metni"ni gönderdiğinde, arka uç Request.QueryString["xxx"] ile bozulmuş karakterler alır.
System.Web.HttpUtility.UrlDecode("xxx", "encoding type") ile nasıl çözerseniz alın, bu yöntem işe yaramıyor.
İlke açıklaması: 1: İlk belirlenmesi gereken şey, istemcinin URL parametreleri gönderildiğinde, Ext.js bunları göndermeden önce kodlayacak ve istemcinin kodlaması varsayılan olarak UTF-8 kodlamasıdır
2: O zaman Request.QueryString["xxx"] ile parametreler alındığında neden bozuluyor?
Derlemeyi adım adım geri çeviriyoruz, 2.1: QueryString özelliğinin koduna bakın:
2.2: FillInQueryStringCollection() yöntemine kesin
2.3: Kesme: QueryStringEncoding
QueryStringEncoding kodundan sistem, küreselleştirme yapılandırma düğümünün kodlama yöntemine varsayılan olarak geçer ve değilse, varsayılan UTF-8 kodlamasıdır 2.4: FillFromString'e Cut (string s, bool urlencoded, Kodlama kodlama)
Bu noktadan itibaren tüm parametre girdilerinin bir kez çağrıldığını görüyoruz: HttpUtility.UrlDecode(str2, kodlama);
İstemci js, Çince'yi utf-8 kodlamasında sunucuya gönderdiğinde, Request.QueryString ile aldığında, önce gb2312 ile küreselleştirme ile bir kez kod çözer ve bu da karakterlerin karışıklığına yol açar.
1: JS kodlama yöntemi URT-8'dir
2: Sunucu tarafı varsayılan GB2312 olarak yapılandırıldı
3: Request.QueryString, alınan parametreleri sistem yapılandırma kodlamasıyla çözmek için varsayılan olarak HttpUtility.UrlDecode'u çağırır.
1: Sistem varsayılan kodlamayı şu sırayla seçer: http istek başlığı - >küreselleştirme yapılandırma düğümü - varsayılan UTF-8
2: URL doğrudan Çince'ye girildiğinde, farklı tarayıcılar farklı şekilde işleyebilir, örneğin: IE kodlamaz ve doğrudan gönderir, Firefox GB2312 kodlamasından sonra URL'yi gönderir.
3: Kodlanmamış "Çince karakterler" için, Request.QueryString dahili çağrısı HttpUtility.UrlDecode kullanıldıktan sonra, gb2312->utf-8 tarafından,
Çince karakter bulunmazsa, varsayılan olarak "%ufffd"ye dönüştürülür ve geri döndürülemez bozuk karakterler oluşur.
4: Çözüme giden yol İlkesi bildiğimde, çözmenin birçok yolu vardır: 1: Küresel birleştirme UTF-8 kodlamasıdır, bu da sorun ve endişeyi azaltır.
2: GB2312 küresel olarak tanımlandığında, URL Çincedir ve js kodlanmalıdır, örneğin ext.js çerçeve gibi.
Bu şekilde, sunucu tarafında kodlama ve çözme sistemini belirleyerek özel olarak yönetebilirsiniz. Varsayılan sistem HttpUtility.UrlDecode("xxx", sistem yapılandırmasının kodlaması) bir kez çağırdığı için, Bu yüzden HttpUtility.UrlEncode("xxx", sistem tarafından yapılandırılan kodlama) tekrar çağırarak orijinal urt-8 kodlama parametresine geri dönersiniz
Sonra HttpUtility.UrlDecode("xxx", utf-8) kullanarak kod çözebilirsiniz. Dizi aaa = istek. Request.QueryString["admin"]; Ev Sahibi string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); dizi a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|