Täna hommikul küsis kolleeg minult küsimuse: ütlesin, et saadud parameetrid olid segased, las ma aitan selle lahendada.
Platvorm, mille eest mu kolleeg vastutab, on ehitatud Ext.js raamistik ning web.config konfiguratsioonifail on konfigureeritud globaalse "GB2312" kodeeringuga:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Kui esiosa esitab "hiina teksti", saab taustsüsteem segased märgid Request.QueryString["xxx"].
Ükskõik kuidas sa dekodeerid System.Web.HttpUtility.UrlDecode("xxx", "kodeerimistüüp"), see ei tööta.
Põhimõtte kirjeldus: 1: Esimene asi, mida määrata, on see, et kui kliendi URL-i parameetrid esitatakse, kodeerib Ext.js need enne esitamist ning kliendi kodeeringuks on vaikimisi UTF-8 kodeerimine
2: Miks siis on see segane, kui saab parameetreid Request.QueryString["xxx"]?
Pöörame kompilatsiooni samm-sammult ümber, 2.1: Vaata QueryStringi omaduse koodi:
2.2: Lõika FillInQueryStringCollection() meetodi sisse
2.3: Lõikamine: QueryStringEncoding
QueryStringEncoding koodist lähtudes valib süsteem vaikimisi globaliseerimise konfiguratsioonisõlme kodeerimismeetodi, ja kui mitte, siis vaikimisi on UTF-8 kodeerimine 2.4: Lõika FillFromStringi (string s, bool urlencoded, kodeerimine)
Sellest punktist leiame, et kõik parameetrisisendid kutsutakse ühe korra: HttpUtility.UrlDecode(str2, kodeerimine);
Kui klient js esitab serverile hiina keele utf-8 kodeeringus, siis Request.QueryStringiga saades dekodeeritakse see esmalt gb2312-ga, mis on globaliseerimise poolt seadistatud, põhjustades segased märgid.
1: JS kodeerimismeetod on URT-8
2: Serveri pool on vaikimisi seadistanud GB2312-ks
3: Request.QueryString kutsub vaikimisi HttpUtility.UrlDecode, et dekodeerida vastuvõetud parameetreid süsteemikonfiguratsiooniga.
1: Süsteem valib vaikimisi kodeeringu järgmises järjekorras: http päringu päis - >globaliseerimise konfiguratsioonisõlm - vaikimisi UTF-8
2: Kui URL sisestatakse otse hiina keelde, võivad erinevad brauserid seda erinevalt käsitleda, näiteks: IE ei kodeeri ja esitab otse, Firefox esitab URL-i pärast GB2312 kodeerimist.
3: Kodeerimata "hiina märkide" puhul, pärast Request.QueryStringi sisemise kutse HttpUtility.UrlDecode kasutamist, autorilt gb2312->utf-8,
Kui hiina märki ei leita, teisendatakse see vaikimisi "%ufffd"-ks, mille tulemusena on pöördumatud segased märgid.
4: Tee lahenduseni Põhimõtet teades on palju võimalusi selle lahendamiseks: 1: Globaalne ühtlustamine on UTF-8 kodeerimine, mis säästab probleeme ja muret.
2: Kui GB2312 on globaalselt määratletud, on URL hiina keeles ja js tuleb kodeerida, näiteks ext.js raamistik.
Nii saad seda teha ainult spetsiaalselt, määrates kodeerimise ja dekodeerimise serveri poolel. Kuna vaikimisi süsteem kutsub HttpUtility.UrlDecode'i ("xxx", süsteemi konfiguratsiooni kodeerimine) korra, Seega kutsud uuesti HttpUtility.UrlEncode'i ("xxx", süsteemi poolt seadistatud kodeeringu), et naasta algse urt-8 kodeerimisparameetri juurde
Seejärel kasuta HttpUtility.UrlDecode("xxx", utf-8) selle dekodeerimiseks. string aaa = taotlus. Request.QueryString["admin"]; Koduomanik string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|