Questa mattina un collega mi ha fatto una domanda: ho detto che i parametri ricevuti erano confusi, lasciate che io aiuti a risolverli.
La piattaforma di cui il mio collega è responsabile è costruita Ext.js framework, e il file di configurazione web.config è configurato con la codifica globale "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Quando il frontend invia il "testo cinese", il backend riceve caratteri distorti con Request.QueryString["xxx"].
Non importa come decodi con System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), non funziona.
Descrizione del principio: 1: La prima cosa da determinare è che quando vengono inviati i parametri URL del client, Ext.js li codifica prima di inviarli, e la codifica del client è di default UTF-8
2: Allora perché è distorto quando ricevono parametri con Request.QueryString["xxx"]?
Invertiamo la compilazione passo dopo passo, 2.1: Guarda il codice per la proprietà QueryString:
2.2: Tagliare nel metodo FillInQueryStringCollection()
2.3: Taglio: QueryStringEncoding
Dal codice QueryStringEncoding, il sistema predefinito utilizza il metodo di codifica del nodo di configurazione globalizzazione e, in caso contrario, il metodo predefinito è la codifica UTF-8 2.4: Taglia in FillFromString(stringa s, bool urlencod, codifica codifica)
Da questo punto si scopre che tutti gli input dei parametri vengono chiamati una sola volta: HttpUtility.UrlDecode(str2, codifica);
Quando il client js invia il cinese al server con la codifica utf-8, ricevendolo con Request.QueryString, lo decodifica prima una volta con gb2312 configurato tramite globalizzazione, risultando in caratteri distorti.
1: Il metodo di codifica JS è URT-8
2: Il lato server ha configurato il default su GB2312
3: Request.QueryString chiamerà di default HttpUtility.UrlDecode per decodificare i parametri ricevuti con la codifica di configurazione di sistema.
1: Il sistema seleziona la codifica predefinita nel seguente ordine: intestazione richiesta http - nodo di configurazione >globalizzazione - UTF-8 predefinito
2: Quando si inserisce l'URL direttamente in cinese, browser diversi possono gestirlo in modo differente, ad esempio: IE non codifica e invia direttamente, Firefox invia l'URL dopo la codifica GB2312.
3: Per "caratteri cinesi" non codificati, dopo aver usato Request.QueryString chiama internamente HttpUtility.UrlDecode, tramite gb2312->utf-8,
Se il carattere cinese non viene trovato, verrà convertito di default in "%ufffd", risultando in caratteri irreversibili e distorti.
4: La strada verso la risoluzione Conoscendo il principio, ci sono molti modi per risolverlo: 1: L'unificazione globale è la codifica UTF-8, che evita problemi e preoccupazioni.
2: Quando GB2312 è specificato globalmente, l'URL è cinese e js deve essere codificato, come ext.js framework.
In questo modo, puoi gestirlo solo in modo specifico, specificando la codifica e la decodifica lato server. Poiché il sistema predefinito chiama HttpUtility.UrlDecode("xxx", la codifica della configurazione di sistema) una volta, Quindi richiami HttpUtility.UrlEncode("xxx", la codifica configurata dal sistema) per tornare al parametro di codifica urt-8 originale
Poi usa HttpUtility.UrlDecode("xxx", utf-8) per decodificarlo. stringa aaa = richiesta. Request.QueryString["admin"]; Proprietario di casa stringa a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); stringa a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|