I morges ble jeg stilt et spørsmål av en kollega: Jeg sa at parameterne som ble mottatt var uforståelige, la meg hjelpe til med å løse det.
Plattformen kollegaen min har ansvar for er bygget Ext.js rammeverk, og web.config-konfigurasjonsfilen er konfigurert med den globale "GB2312"-kodingen:
<globaliseringsforespørselKoding="gb2312" svarKoding="gb2312" filKoding="gb2312" culture="zh-CN"/>
Når frontenden sender inn «kinesisk tekst», mottar backenden forvrengte tegn med Request.QueryString["xxx"].
Uansett hvordan du dekodes med System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), fungerer det ikke.
Hovedbeskrivelse: 1: Det første som må avgjøres er at når klientens URL-parametere sendes inn, vil Ext.js kode dem før de sendes inn, og klientens koding er som standard UTF-8-koding
2: Hvorfor er det da utydelig når man mottar parametere med Request.QueryString["xxx"]?
Vi reverserer kompileringen steg for steg, 2.1: Se på koden for QueryString-egenskapen:
2.2: Kutt inn i FillInQueryStringCollection()-metoden
2.3: Kutt: QueryStringEncoding
Fra QueryStringEncoding-koden går systemet som standard over til kodingsmetoden til globaliseringskonfigurasjonsnoden, og hvis ikke, er standarden UTF-8-koding 2.4: Kutt i FillFromString (streng s, bool urlencoded, koding av koding)
Fra dette punktet finner vi at alle parameterinnganger kalles én gang: HttpUtility.UrlDecode(str2, koding);
Når klient js sender kinesisk til serveren i utf-8-koding, vil den først dekode det én gang med gb2312 konfigurert ved globalisering, noe som resulterer i utydelige tegn.
1: JS-kodingsmetoden er URT-8
2: Serversiden har konfigurert standardinnstillingen til GB2312
3: Request.QueryString vil som standard kalle HttpUtility.UrlDecode for å dekode mottatte parametere med systemkonfigurasjonskoding.
1: Systemet velger standardkodingen i følgende rekkefølge: http forespørselshode - >globaliseringskonfigurasjonsnode - standard UTF-8
2: Når URL-en legges direkte inn på kinesisk, kan ulike nettlesere håndtere det forskjellig, for eksempel: IE koder ikke og sender inn direkte, Firefox sender inn URL-en etter GB2312-kodingen.
3: For ukodede "kinesiske tegn", etter bruk av Request.QueryString internt kall HttpUtility.UrlDecode, av gb2312->utf-8,
Hvis det kinesiske tegnet ikke blir funnet, vil det som standard bli konvertert til "%ufffd", noe som resulterer i irreversible utydelige tegn.
4: Veien til løsning Når man kjenner prinsippet, finnes det mange måter å løse det på: 1: Den globale samlingen er UTF-8-koding, som sparer for problemer og bekymringer.
2: Når GB2312 er globalt spesifisert, er url-en kinesisk, og js må kodes, slik som ext.js rammeverk.
På denne måten kan du bare håndtere det spesielt, ved å spesifisere koding og dekoding på serversiden. Fordi standardsystemet kaller HttpUtility.UrlDecode("xxx", kodingen av systemkonfigurasjonen) én gang, Så du kaller HttpUtility.UrlEncode("xxx", kodingen konfigurert av systemet) igjen for å returnere til den opprinnelige urt-8-kodingsparameteren
Bruk deretter HttpUtility.UrlDecode("xxx", utf-8) for å dekode den. streng aaa = forespørsel. Request.QueryString["admin"]; Huseier streng a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|