Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 22544|Odpoveď: 0

[Zdroj] C# Požiadavka prijíma skreslené znaky pre parametre

[Kopírovať odkaz]
Zverejnené 25. 12. 2015 18:41:49 | | | |


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








Predchádzajúci:Ahoj
Budúci:Aký algoritmus, už niekoľko dní som depresívny.
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com