Danes zjutraj mi je kolega zastavil vprašanje: rekel sem, da so prejeti parametri popačeni, dovolite, da pomagam rešiti težavo.
Platforma, za katero je odgovoren moj kolega, je zgrajena Ext.js ogrodju, konfiguracijska datoteka web.config pa je konfigurirana z globalnim kodiranjem "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Ko frontend pošlje "kitajsko besedilo", backend prejme popačene znake z Request.QueryString["xxx"].
Ne glede na to, kako dekodiraš s System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), ne deluje.
Opis načela: 1: Prva stvar, ki jo je treba ugotoviti, je, da Ext.js ob oddaji URL parametrov odjemalca kodirala pred oddajo, pri čemer je kodiranje odjemalca privzeto UTF-8 kodiranje
2: Zakaj je potem popačen, ko prejemam parametre s Request.QueryString["xxx"]?
Prevajanje obrnemo korak za korakom, 2.1: Oglejte si kodo lastnosti QueryString:
2.2: Vključite metodo FillInQueryStringCollection()
2.3: Rez: QueryStringEncoding
Iz kode QueryStringEncoding sistem privzeto uporablja metodo kodiranja globalizacijskega konfiguracijskega vozlišča, če pa ne, je privzeto kodiranje UTF-8 2.4: Izrezovanje v FillFromString (string s, bool urlenkodiran, kodiranje kodiranja)
Od tu naprej ugotovimo, da se vsi vhodi parametrov kličejo enkrat: HttpUtility.UrlDecode(str2, kodiranje);
Ko odjemalec js pošlje kitajščino strežniku v utf-8 kodiranju, ga ob prejemu z Request.QueryString najprej enkrat dekodira z gb2312, konfiguriranim z globalizacijo, kar povzroči popačene znake.
1: Metoda kodiranja JS je URT-8
2: Strežniška stran je privzeto nastavila na GB2312
3: Request.QueryString bo privzeto klical HttpUtility.UrlDecode za dekodiranje prejetih parametrov s sistemskim konfiguracijskim kodiranjem.
1: Sistem izbere privzeto kodiranje v naslednjem vrstnem redu: HTTP header request - >globalization configuration node - default UTF-8
2: Ko URL vnesete neposredno v kitajščino, ga lahko različni brskalniki obravnavajo različno, na primer: IE ne kodira in pošilja neposredno, Firefox pa pošlje URL po kodiranju GB2312.
3: Za nekodirane "kitajske znake", po uporabi Request.QueryString interni klic HttpUtility.UrlDecode, avtor gb2312->utf-8,
Če kitajski znak ni najden, se privzeto pretvori v "%ufffd", kar povzroči nepovratne popačene znake.
4: Pot do rešitve Če poznamo načelo, obstaja veliko načinov, kako ga rešiti: 1: Globalna enotnost je kodiranje UTF-8, kar prihrani težave in skrbi.
2: Ko je GB2312 globalno določen, je URL kitajski, js pa mora biti kodiran, na primer ext.js framework.
Na ta način ga lahko upravljate le posebej, pri čemer določite kodiranje in dekodiranje na strežniški strani. Ker privzeti sistem enkrat pokliče HttpUtility.UrlDecode ("xxx", kodiranje sistemske konfiguracije), Torej ponovno pokličete HttpUtility.UrlEncode ("xxx", kodiranje, ki ga konfigurira sistem), da se vrnete na prvotni urt-8 parameter kodiranja
Nato uporabite HttpUtility.UrlDecode("xxx", utf-8) za dekodiranje. niz aaa = zahteva. Request.QueryString["admin"]; Lastnik doma string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|