Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 22544|Atsakyti: 0

[Šaltinis] c# Užklausa gauna iškraipytus simbolius parametrams

[Kopijuoti nuorodą]
Paskelbta 2015-12-25 18:41:49 | | | |


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








Ankstesnis:sveikas
Kitą:Koks algoritmas, kelias dienas buvau prislėgtas.
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com