Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 22544|Odgovoriti: 0

[Vir] C# Zahteva prejme popačene znake za parametre

[Kopiraj povezavo]
Objavljeno na 25. 12. 2015 18:41:49 | | | |


Danes zjutraj mi je kolega zastavil vprašanje: rekel sem, da so prejeti parametri popačeni, dovolite, da pomagam rešiti težavo.


Platforma, za katero je odgovoren moj kolega, je zgrajena Ext.js ogrodju, konfiguracijska datoteka web.config pa je konfigurirana z globalnim kodiranjem "GB2312":

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

Ko frontend pošlje "kitajsko besedilo", backend prejme popačene znake z Request.QueryString["xxx"].

Ne glede na to, kako dekodiraš s System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), ne deluje.

Opis načela:
1: Prva stvar, ki jo je treba ugotoviti, je, da Ext.js ob oddaji URL parametrov odjemalca kodirala pred oddajo, pri čemer je kodiranje odjemalca privzeto UTF-8 kodiranje


2: Zakaj je potem popačen, ko prejemam parametre s Request.QueryString["xxx"]?

Prevajanje obrnemo korak za korakom,
2.1: Oglejte si kodo lastnosti QueryString:


2.2: Vključite metodo FillInQueryStringCollection()


2.3: Rez: QueryStringEncoding

Iz kode QueryStringEncoding sistem privzeto uporablja metodo kodiranja globalizacijskega konfiguracijskega vozlišča, če pa ne, je privzeto kodiranje UTF-8
2.4: Izrezovanje v FillFromString (string s, bool urlenkodiran, kodiranje kodiranja)

Od tu naprej ugotovimo, da se vsi vhodi parametrov kličejo enkrat: HttpUtility.UrlDecode(str2, kodiranje);

Ko odjemalec js pošlje kitajščino strežniku v utf-8 kodiranju, ga ob prejemu z Request.QueryString najprej enkrat dekodira z gb2312, konfiguriranim z globalizacijo, kar povzroči popačene znake.

1: Metoda kodiranja JS je URT-8

2: Strežniška stran je privzeto nastavila na GB2312

3: Request.QueryString bo privzeto klical HttpUtility.UrlDecode za dekodiranje prejetih parametrov s sistemskim konfiguracijskim kodiranjem.

1: Sistem izbere privzeto kodiranje v naslednjem vrstnem redu: HTTP header request - >globalization configuration node - default UTF-8

2: Ko URL vnesete neposredno v kitajščino, ga lahko različni brskalniki obravnavajo različno, na primer: IE ne kodira in pošilja neposredno, Firefox pa pošlje URL po kodiranju GB2312.

3: Za nekodirane "kitajske znake", po uporabi Request.QueryString interni klic HttpUtility.UrlDecode, avtor gb2312->utf-8,

Če kitajski znak ni najden, se privzeto pretvori v "%ufffd", kar povzroči nepovratne popačene znake.

4: Pot do rešitve
Če poznamo načelo, obstaja veliko načinov, kako ga rešiti:
1: Globalna enotnost je kodiranje UTF-8, kar prihrani težave in skrbi.

2: Ko je GB2312 globalno določen, je URL kitajski, js pa mora biti kodiran, na primer ext.js framework.

Na ta način ga lahko upravljate le posebej, pri čemer določite kodiranje in dekodiranje na strežniški strani.
Ker privzeti sistem enkrat pokliče HttpUtility.UrlDecode ("xxx", kodiranje sistemske konfiguracije),
Torej ponovno pokličete HttpUtility.UrlEncode ("xxx", kodiranje, ki ga konfigurira sistem), da se vrnete na prvotni urt-8 parameter kodiranja

Nato uporabite HttpUtility.UrlDecode("xxx", utf-8) za dekodiranje.
niz aaa = zahteva. Request.QueryString["admin"];    Lastnik doma
                            string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312"));
                            string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);








Prejšnji:živjo
Naslednji:Kakšen algoritem, že nekaj dni sem depresiven.
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com