Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 22544|Yanıt: 0

[Kaynak] c# İstek, parametreler için karışık karakterler alır

[Bağlantıyı kopyala]
Yayınlandı 25.12.2015 18:41:49 | | | |


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);








Önceki:Merhaba
Önümüzdeki:Ne algoritma, birkaç gündür depresyondayım.
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com