See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 22544|Vastuse: 0

[Allikas] c# Päring võtab vastu segased märgid parameetrite jaoks

[Kopeeri link]
Postitatud 25.12.2015 18:41:49 | | | |


Täna hommikul küsis kolleeg minult küsimuse: ütlesin, et saadud parameetrid olid segased, las ma aitan selle lahendada.


Platvorm, mille eest mu kolleeg vastutab, on ehitatud Ext.js raamistik ning web.config konfiguratsioonifail on konfigureeritud globaalse "GB2312" kodeeringuga:

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

Kui esiosa esitab "hiina teksti", saab taustsüsteem segased märgid Request.QueryString["xxx"].

Ükskõik kuidas sa dekodeerid System.Web.HttpUtility.UrlDecode("xxx", "kodeerimistüüp"), see ei tööta.

Põhimõtte kirjeldus:
1: Esimene asi, mida määrata, on see, et kui kliendi URL-i parameetrid esitatakse, kodeerib Ext.js need enne esitamist ning kliendi kodeeringuks on vaikimisi UTF-8 kodeerimine


2: Miks siis on see segane, kui saab parameetreid Request.QueryString["xxx"]?

Pöörame kompilatsiooni samm-sammult ümber,
2.1: Vaata QueryStringi omaduse koodi:


2.2: Lõika FillInQueryStringCollection() meetodi sisse


2.3: Lõikamine: QueryStringEncoding

QueryStringEncoding koodist lähtudes valib süsteem vaikimisi globaliseerimise konfiguratsioonisõlme kodeerimismeetodi, ja kui mitte, siis vaikimisi on UTF-8 kodeerimine
2.4: Lõika FillFromStringi (string s, bool urlencoded, kodeerimine)

Sellest punktist leiame, et kõik parameetrisisendid kutsutakse ühe korra: HttpUtility.UrlDecode(str2, kodeerimine);

Kui klient js esitab serverile hiina keele utf-8 kodeeringus, siis Request.QueryStringiga saades dekodeeritakse see esmalt gb2312-ga, mis on globaliseerimise poolt seadistatud, põhjustades segased märgid.

1: JS kodeerimismeetod on URT-8

2: Serveri pool on vaikimisi seadistanud GB2312-ks

3: Request.QueryString kutsub vaikimisi HttpUtility.UrlDecode, et dekodeerida vastuvõetud parameetreid süsteemikonfiguratsiooniga.

1: Süsteem valib vaikimisi kodeeringu järgmises järjekorras: http päringu päis - >globaliseerimise konfiguratsioonisõlm - vaikimisi UTF-8

2: Kui URL sisestatakse otse hiina keelde, võivad erinevad brauserid seda erinevalt käsitleda, näiteks: IE ei kodeeri ja esitab otse, Firefox esitab URL-i pärast GB2312 kodeerimist.

3: Kodeerimata "hiina märkide" puhul, pärast Request.QueryStringi sisemise kutse HttpUtility.UrlDecode kasutamist, autorilt gb2312->utf-8,

Kui hiina märki ei leita, teisendatakse see vaikimisi "%ufffd"-ks, mille tulemusena on pöördumatud segased märgid.

4: Tee lahenduseni
Põhimõtet teades on palju võimalusi selle lahendamiseks:
1: Globaalne ühtlustamine on UTF-8 kodeerimine, mis säästab probleeme ja muret.

2: Kui GB2312 on globaalselt määratletud, on URL hiina keeles ja js tuleb kodeerida, näiteks ext.js raamistik.

Nii saad seda teha ainult spetsiaalselt, määrates kodeerimise ja dekodeerimise serveri poolel.
Kuna vaikimisi süsteem kutsub HttpUtility.UrlDecode'i ("xxx", süsteemi konfiguratsiooni kodeerimine) korra,
Seega kutsud uuesti HttpUtility.UrlEncode'i ("xxx", süsteemi poolt seadistatud kodeeringu), et naasta algse urt-8 kodeerimisparameetri juurde

Seejärel kasuta HttpUtility.UrlDecode("xxx", utf-8) selle dekodeerimiseks.
string aaa = taotlus. Request.QueryString["admin"];    Koduomanik
                            string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312"));
                            string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);








Eelmine:Hei
Järgmine:Milline algoritm, olen olnud mitu päeva masenduses.
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com