Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 22544|Atbildi: 0

[Avots] c# Pieprasījums saņem izkropļotas rakstzīmes parametriem

[Kopēt saiti]
Publicēts 25.12.2015 18:41:49 | | | |


Šorīt kolēģis man uzdeva jautājumu: es teicu, ka saņemtie parametri ir izkropļoti, ļaujiet man palīdzēt to atrisināt.


Platforma, par kuru ir atbildīgs mans kolēģis, ir veidota Ext.js ietvaru, un web.config konfigurācijas fails ir konfigurēts ar globālo "GB2312" kodējumu:

<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>

Kad frontend iesniedz ķīniešu tekstu, backend saņem kropļotas rakstzīmes ar Request.QueryString["xxx"].

Neatkarīgi no tā, kā jūs dekodējat ar System.Web.HttpUtility.UrlDecode ("xxx", "kodējuma tips"), tas nedarbojas.

Principa apraksts:
1: Pirmā lieta, kas jānosaka, ir tas, ka, iesniedzot klienta URL parametrus, Ext.js tos kodēs pirms to iesniegšanas, un klienta kodējums pēc noklusējuma ir UTF-8 kodējums


2: Tad kāpēc tas ir izkropļots, saņemot parametrus ar Request.QueryString["xxx"]?

Mēs soli pa solim mainām kompilāciju,
2.1: Apskatiet rekvizīta QueryString kodu:


2.2: Iegrieziet FillInQueryStringCollection() metodi


2.3: Izgriezt: QueryStringEncoding

No koda QueryStringEncoding sistēma pēc noklusējuma izmanto globalizācijas konfigurācijas mezgla kodēšanas metodi, un, ja nē, noklusējums ir UTF-8 kodējums
2.4: Izgriezt FillFromString (virkne s, bool urlencoded, kodējuma kodējums)

No šī brīža mēs konstatējam, ka visas parametru ievades tiek izsauktas vienu reizi: HttpUtility.UrlDecode(str2, kodējums);

Kad klients js iesniedz ķīniešu valodu serverim utf-8 kodējumā, saņemot to ar Request.QueryString, tas vispirms to vienu reizi dekodēs ar globalizācijas konfigurēto gb2312, kā rezultātā rodas izkropļotas rakstzīmes.

1: JS kodēšanas metode ir URT-8

2: Servera pusē ir konfigurēts noklusējums uz GB2312

3: Request.QueryString pēc noklusējuma izsauc HttpUtility.UrlDecode, lai atšifrētu saņemtos parametrus ar sistēmas konfigurācijas kodējumu.

1: Sistēma izvēlas noklusējuma kodējumu šādā secībā: http pieprasījuma galvene - >globalizācijas konfigurācijas mezgls - noklusējuma UTF-8

2: Ievadot URL tieši ķīniešu valodā, dažādas pārlūkprogrammas to var apstrādāt atšķirīgi, piemēram: IE nekodē un iesniedz tieši, Firefox iesniedz URL pēc GB2312 kodējuma.

3: Nekodētām "ķīniešu rakstzīmēm" pēc Request.QueryString iekšējā izsaukuma HttpUtility.UrlDecode izmantošanas, izmantojot gb2312->utf-8,

Ja ķīniešu rakstzīme netiek atrasta, tā pēc noklusējuma tiks konvertēta uz "%ufffd", kā rezultātā tiks iegūtas neatgriezeniskas izkropļotas rakstzīmes.

4: Ceļš uz risinājumu
Zinot principu, ir daudz veidu, kā to atrisināt:
1: Globālā apvienošana ir UTF-8 kodējums, kas ietaupa nepatikšanas un raizes.

2: Ja GB2312 ir globāli norādīts, URL ir ķīniešu valoda, un js ir jākodē, piemēram, ext.js ietvars.

Tādā veidā jūs varat to apstrādāt tikai īpaši, norādot kodējumu un dekodēšanu servera pusē.
Tā kā noklusējuma sistēma vienu reizi izsauc HttpUtility.UrlDecode ("xxx", sistēmas konfigurācijas kodējums),
Tātad jūs atkal izsaucat HttpUtility.UrlEncode ("xxx", sistēmas konfigurētais kodējums), lai atgrieztos pie sākotnējā urt-8 kodējuma parametra

Pēc tam izmantojiet HttpUtility.UrlDecode ("xxx", utf-8), lai to atšifrētu.
virkne aaa = pieprasījums. Request.QueryString["admin"];    Mājas īpašnieks
                            virkne a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312"));
                            virkne a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);








Iepriekšējo:čau
Nākamo:Kāds algoritms, es vairākas dienas esmu nomākts.
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com