Šį rytą kolega man uždavė klausimą: pasakiau, kad gauti parametrai buvo iškraipyti, leiskite man padėti tai išspręsti.
Platforma, už kurią atsakingas mano kolega, yra sukurta Ext.js sistema, o web.config konfigūracijos failas sukonfigūruotas su visuotiniu "GB2312" kodavimu:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Kai sąsaja pateikia "kinišką tekstą", užpakalinė dalis gauna iškraipytus simbolius su Request.QueryString["xxx"].
Nesvarbu, kaip dekoduojate naudodami System.Web.HttpUtility.UrlDecode("xxx", "kodavimo tipas"), jis neveikia.
Principo aprašymas: 1: Pirmas dalykas, kurį reikia nustatyti, yra tai, kad pateikus kliento URL parametrus, Ext.js juos užkoduos prieš pateikdamas, o kliento kodavimas pagal numatytuosius nustatymus yra UTF-8 kodavimas
2: Tada kodėl jis yra iškraipytas, kai gaunate parametrus su Request.QueryString["xxx"]?
Mes žingsnis po žingsnio apverčiame kompiliaciją, 2.1: Peržiūrėkite ypatybės QueryString kodą:
2.2: Iškirpti į FillInQueryStringCollection() metodą
2.3: Iškirpti: QueryStringEncoding
Iš QueryStringEncoding kodo sistema pagal numatytuosius nustatymus naudoja globalizacijos konfigūracijos mazgo kodavimo metodą, o jei ne, numatytasis yra UTF-8 kodavimas 2.4: Iškirpti į FillFromString (eilutė s, bool urlencoded, kodavimo kodavimas)
Nuo šio momento matome, kad visos parametrų įvestys iškviečiamos vieną kartą: HttpUtility.UrlDecode(str2, kodavimas);
Kai klientas js pateikia kinų kalbą serveriui utf-8 kodavimu, gavęs jį su Request.QueryString, jis pirmiausia vieną kartą iššifruoja jį su gb2312, sukonfigūruotu globalizacijos būdu, todėl atsiranda iškraipytų simbolių.
1: JS kodavimo metodas yra URT-8
2: Serverio pusėje sukonfigūruota numatytoji GB2312
3: Request.QueryString pagal numatytuosius nustatymus iškvies HttpUtility.UrlDecode, kad iššifruotų gautus parametrus su sistemos konfigūracijos kodavimu.
1: Sistema pasirenka numatytąjį kodavimą tokia tvarka: http užklausos antraštė - >globalizacijos konfigūracijos mazgas - numatytasis UTF-8
2: Įvedant URL tiesiai į kinų kalbą, skirtingos naršyklės gali jį tvarkyti skirtingai, pavyzdžiui: IE nekoduoja ir pateikia tiesiogiai, Firefox pateikia URL po GB2312 kodavimo.
3: Dėl neužkoduotų "kinų simbolių", panaudojus Request.QueryString vidinį iškvietimą HttpUtility.UrlDecode, gb2312->utf-8,
Jei kinų simbolis nerastas, jis bus konvertuotas į "%ufffd" pagal numatytuosius nustatymus, todėl bus negrįžtamai iškraipyti simboliai.
4: Kelias į sprendimą Žinant principą, yra daugybė būdų, kaip jį išspręsti: 1: Pasaulinis suvienijimas yra UTF-8 kodavimas, kuris taupo rūpesčius ir rūpesčius.
2: Kai GB2312 yra nurodytas visuotinai, URL yra kinų ir js turi būti užkoduotas, pvz., ext.js sistema.
Tokiu būdu galite tai tvarkyti tik specialiai, nurodydami kodavimą ir dekodavimą serverio pusėje. Kadangi numatytoji sistema vieną kartą iškviečia HttpUtility.UrlDecode ("xxx", sistemos konfigūracijos kodavimas), Taigi jūs vėl iškviečiate HttpUtility.UrlEncode ("xxx", sistemos sukonfigūruotas kodavimas), kad grįžtumėte į pradinį urt-8 kodavimo parametrą
Tada naudokite HttpUtility.UrlDecode ("xxx", utf-8), kad jį iššifruotumėte. eilutė aaa = užklausa. Request.QueryString["admin"]; Namo savininkas eilutė a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); eilutė a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|