I morse fick jag en fråga av en kollega: Jag sa att de mottagna parametrarna var förvrängda, låt mig hjälpa till att lösa det.
Plattformen som min kollega ansvarar för är byggd Ext.js ramverk, och konfigurationsfilen web.config är konfigurerad med den globala "GB2312"-kodningen:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
När frontend skickar in "kinesisk text" får backend förvrängda tecken med Request.QueryString["xxx"].
Oavsett hur du avkodar med System.Web.HttpUtility.UrlDecode("xxx", "encoding type") fungerar det inte.
Huvudbeskrivning: 1: Det första att avgöra är att när klientens URL-parametrar skickas in, kommer Ext.js att koda dem innan de skickas in, och klientens kodning är UTF-8-kodning som standard
2: Varför är det då förvrängt när man tar emot parametrar med Request.QueryString["xxx"]?
Vi vänder på kompileringen steg för steg, 2.1: Titta på koden för egenskapen QueryString:
2.2: Skär in i FillInQueryStringCollection()-metoden
2.3: Klipp: QueryStringEncoding
Från QueryStringEncoding-koden går systemet tillbaka till kodningsmetoden för globaliseringskonfigurationsnoden, och om inte, är standarden UTF-8-kodning 2.4: Skär i FillFromString (sträng s, bool urlencoded, kodningskodning)
Från denna punkt finner vi att alla parameterindata anropas en gång: HttpUtility.UrlDecode(str2, kodning);
När klient js skickar in kinesiska till servern i utf-8-kodning, kommer den först att avkoda den med Request.QueryString när den tas emot med gb2312 konfigurerad av globalisering, vilket resulterar i förvrängda tecken.
1: JS-kodningsmetoden är URT-8
2: Serversidan har konfigurerat standardinställningen till GB2312
3: Request.QueryString anropar HttpUtility.UrlDecode som standard för att avkoda de mottagna parametrarna med systemkonfigurationskodning.
1: Systemet väljer standardkodningen i följande ordning: http-begäran-header - >globaliseringskonfigurationsnod - standard UTF-8
2: När URL:en matas in direkt till kinesiska kan olika webbläsare hantera det olika, till exempel: IE kodar inte och skickar in direkt, Firefox skickar in URL:en efter GB2312-kodningen.
3: För okodade "kinesiska tecken", efter att ha använt Request.QueryString internt anrop HttpUtility.UrlDecode, av gb2312->utf-8,
Om det kinesiska tecknet inte hittas kommer det att konverteras till "%ufffd" som standard, vilket resulterar i irreversibla förvrängda tecken.
4: Vägen till lösning Med tanke på principen finns det många sätt att lösa den: 1: Den globala föreningen är UTF-8-kodning, vilket sparar besvär och oro.
2: När GB2312 är globalt specificerad är url:en kinesisk och js måste kodas, till exempel ext.js ramverk.
På så sätt kan du bara hantera det speciellt, genom att specificera kodning och avkodning på serversidan. Eftersom standardsystemet anropar HttpUtility.UrlDecode("xxx", kodningen av systemkonfigurationen) en gång, Så du anropar HttpUtility.UrlEncode("xxx", kodningen konfigurerad av systemet) igen för att återgå till den ursprungliga urt-8-kodningsparametern
Använd sedan HttpUtility.UrlDecode("xxx", utf-8) för att avkoda den. sträng AAA = begäran. Request.QueryString["admin"]; Husägare sträng a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); sträng a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|