Dnes ráno sa ma kolega opýtal otázku: povedal som, že prijaté parametre boli skreslené, nechajte ma pomôcť to vyriešiť.
Platforma, za ktorú je môj kolega zodpovedný, je postavená Ext.js frameworku a konfiguračný súbor web.config je nakonfigurovaný s globálnym kódovaním "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Keď frontend odošle "čínsky text", backend dostane skreslené znaky s Request.QueryString["xxx"].
Nezáleží na tom, ako dekódujete pomocou System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), nefunguje to.
Popis princípu: 1: Prvou vecou, ktorú treba zistiť, je, že keď sú URL parametre klienta odoslané, Ext.js ich zakóduje pred odoslaním a kódovanie klienta je predvolene UTF-8
2: Prečo je potom skreslený pri prijímaní parametrov pomocou Request.QueryString["xxx"]?
Postupne obrátime kompiláciu krok za krokom, 2.1: Pozrite sa na kód vlastnosti QueryString:
2.2: Rozrezať metódu FillInQueryStringCollection()
2.3: Cut: QueryStringEncoding
Z kódu QueryStringEncoding systém predvolene používa kódovaciu metódu globalizačného konfiguračného uzla, a ak nie, predvoleným je kódovanie UTF-8 2.4: Rozrezať do FillFromString (string s, bool urlencoded, kódovanie kódovania)
Z tohto bodu zistíme, že všetky vstupy parametrov sú volané raz: HttpUtility.UrlDecode(str2, encoding);
Keď klient js odosiela čínsky jazyk na server v kódovaní utf-8, pri prijímaní cez Request.QueryString ho najprv raz dekóduje pomocou gb2312 nakonfigurovaného globalizáciou, čo vedie k nezrozumiteľným znakom.
1: Metóda kódovania v JS je URT-8
2: Serverová strana má nastavený predvolený na GB2312
3: Request.QueryString bude predvolene volať HttpUtility.UrlDecode na dekódovanie prijatých parametrov pomocou kódovania systémovej konfigurácie.
1: Systém vyberá predvolené kódovanie v nasledujúcom poradí: HTTP request header - >globalization configuration node - default UTF-8
2: Pri priamom zadávaní URL do čínštiny môžu rôzne prehliadače spracovávať túto adresu odlišne, napríklad: IE nekóduje a odosiela priamo, Firefox odosiela URL po kódovaní GB2312.
3: Pre nekódované "čínske znaky" po použití interného volania Request.QueryString HttpUtility.UrlDecode, od gb2312->utf-8,
Ak sa čínsky znak nenájde, predvolene sa prevedie na "%ufffd", čo vedie k nezvratným nezrozumiteľným znakom.
4: Cesta k vyriešeniu Poznajúc princíp, existuje mnoho spôsobov, ako ho vyriešiť: 1: Globálne zjednotenie je kódovanie UTF-8, čo šetrí starosti a starosti.
2: Keď je GB2312 globálne špecifikovaný, url je čínsky a js musí byť zakódovaný, napríklad ext.js framework.
Týmto spôsobom to môžete riešiť len špeciálne, pričom na serverovej strane špecifikujete kódovanie a dekódovanie. Pretože predvolený systém volá HttpUtility.UrlDecode ("xxx", kódovanie systémovej konfigurácie) raz, Takže opäť zavoláte HttpUtility.UrlEncode ("xxx", kódovanie nakonfigurované systémom), aby ste sa vrátili k pôvodnému parametru kódovania urt-8
Potom použite HttpUtility.UrlDecode("xxx", utf-8) na jeho dekódovanie. reťazec aaa = požiadavka. Request.QueryString["admin"]; Majiteľ domu string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|