Ce matin, un collègue m’a posé une question : j’ai dit que les paramètres reçus étaient brouillés, laissez-moi aider à les résoudre.
La plateforme dont mon collègue est responsable est construite Ext.js framework, et le fichier de configuration web.config est configuré avec l’encodage global « GB2312 » :
<globalisation requestEncoding="gb2312 » responseEncoding="gb2312 » fileEncoding="gb2312 » culture="zh-CN"/>
Lorsque le frontend envoie le « texte chinois », le backend reçoit des caractères brouillés avec Request.QueryString["xxx"].
Peu importe comment vous décodez avec System.Web.HttpUtility.UrlDecode(« xxx », « encoding type »), cela ne fonctionne pas.
Description du principe : 1 : La première chose à déterminer est que lorsque les paramètres URL du client sont soumis, Ext.js les encodera avant de les soumettre, et que l’encodage du client est par défaut un codage UTF-8
2 : Alors pourquoi est-ce brouillé lors de la réception des paramètres avec Request.QueryString["xxx"] ?
Nous inversons la compilation étape par étape, 2.1 : Regardez le code de la propriété QueryString :
2.2 : Découper dans la méthode FillInQueryStringCollection()
2.3 : Cut : QueryStringEncoding
D’après le code QueryStringEncoding, le système utilise par défaut la méthode d’encodage du nœud de configuration de globalisation, et sinon, le code par défaut est l’encodage UTF-8 2.4 : Coupe dans FillFromString(chaîne s, urlencodée bool, encodage par encodage)
À partir de ce point, on constate que toutes les entrées de paramètres sont appelées une seule fois : HttpUtility.UrlDecode(str2, encoding) ;
Lorsque le client js soumet du chinois au serveur en codage utf-8, lorsqu’il le reçoit avec Request.QueryString, il le décode d’abord une fois avec gb2312 configuré par la mondialisation, ce qui donne des caractères brouillés.
1 : La méthode d’encodage JS est URT-8
2 : Le côté serveur a configuré le code par défaut sur GB2312
3 : Request.QueryString appellera par défaut HttpUtility.UrlDecode pour décoder les paramètres reçus avec l’encodage de configuration système.
1 : Le système sélectionne l’encodage par défaut dans l’ordre suivant : en-tête requête http - nœud de configuration >globalisation - UTF-8 par défaut
2 : Lors de la saisie directe de l’URL en chinois, différents navigateurs peuvent la gérer différemment, par exemple : IE n’encode pas et soumet directement, Firefox envoie l’URL après l’encodage GB2312.
3 : Pour les « caractères chinois » non encodés, après avoir utilisé Request.QueryString, appel interne HttpUtility.UrlDecode, par gb2312->utf-8,
Si le caractère chinois n’est pas trouvé, il sera converti par défaut en « %ufffd », ce qui entraînera des caractères irréversiblement brouillés.
4 : La route vers la résolution Connaissant le principe, il existe de nombreuses façons de le résoudre : 1 : L’unification mondiale est l’encodage UTF-8, qui évite des soucis et des soucis.
2 : Lorsque GB2312 est spécifié globalement, l’URL est chinoise, et js doit être encodé, comme ext.js framework.
De cette façon, vous ne pouvez le gérer que de manière spéciale, en spécifiant l’encodage et le décodage côté serveur. Parce que le système par défaut appelle HttpUtility.UrlDecode(« xxx », l’encodage de la configuration système) une fois, Vous appelez donc HttpUtility.UrlEncode (« xxx », l’encodage configuré par le système) pour revenir au paramètre d’encodage urt-8 d’origine
Ensuite, utilisez HttpUtility.UrlDecode (« xxx », utf-8) pour le décoder. chaîne AAA = requête. Request.QueryString["admin"] ; Propriétaire chaîne a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding(« GB2312 »)) ; chaîne a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8) ;
|