Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 22544|Risposta: 0

[Fonte] La richiesta c# riceve caratteri distorti per i parametri

[Copiato link]
Pubblicato su 25/12/2015 18:41:49 | | | |


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








Precedente:ciao
Prossimo:Che algoritmo, sono depresso per diversi giorni.
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com