În această dimineață am primit o întrebare de la un coleg: am spus că parametrii primiți sunt distorsionați, lasă-mă să ajut la rezolvarea problemei.
Platforma de care este responsabil colegul meu este construită Ext.js framework, iar fișierul de configurare web.config este configurat cu codificarea globală "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Când frontend-ul trimite "textul chinezesc", backend-ul primește caractere distorsionate cu Request.QueryString["xxx"].
Indiferent cum decodezi cu System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), nu funcționează.
Descrierea principiului: 1: Primul lucru de stabilit este că atunci când parametrii URL ai clientului sunt trimiși, Ext.js îi va codifica înainte de a-i trimite, iar codarea clientului este implicită UTF-8
2: Atunci de ce este distorsionat când primești parametri cu Request.QueryString["xxx"]?
Inversăm compilația pas cu pas, 2.1: Uită-te la codul proprietății QueryString:
2.2: Decupare în metoda FillInQueryStringCollection()
2.3: Cut: QueryStringEncoding
Din codul QueryStringEncoding, sistemul folosește implicit metoda de codare a nodului de configurare a globalizării, iar dacă nu, implicit este codarea UTF-8 2.4: Tăie în FillFromString(string s, bool urlencoded, codare Encoding)
Din acest punct constatăm că toate intrările parametrilor sunt numite o singură dată: HttpUtility.UrlDecode(str2, codificare);
Când clientul js trimite chineză serverului prin codare utf-8, când îl primește cu Request.QueryString, îl va decoda mai întâi o dată cu gb2312 configurat prin globalizare, rezultând caractere distorsionate.
1: Metoda de codare JS este URT-8
2: Partea serverului a configurat implicit GB2312
3: Request.QueryString va apela implicit HttpUtility.UrlDecode pentru a decoda parametrii primiți prin codificarea configurării sistemului.
1: Sistemul selectează codificarea implicită în următoarea ordine: antet de cerere http - >nod de configurare globalizare - implicit UTF-8
2: Când introduci URL-ul direct în chineză, diferite browsere pot gestiona diferit, de exemplu: IE nu codifică și trimite direct, Firefox trimite URL-ul după codificarea GB2312.
3: Pentru "caractere chinezești" necodificate, după folosirea apelului intern Request.QueryString HttpUtility.UrlDecode, de gb2312->utf-8,
Dacă caracterul chinezesc nu este găsit, acesta va fi convertit implicit în "%ufffd", rezultând caractere ireversibile și distorsionate.
4: Drumul spre rezolvare Cunoscând principiul, există multe moduri de a o rezolva: 1: Unificarea globală este codificarea UTF-8, care economisește probleme și griji.
2: Când GB2312 este specificat global, URL-ul este chinezesc, iar js trebuie codificat, cum ar fi ext.js framework.
Astfel, poți gestiona doar în mod special, specificând codarea și decodarea pe partea de server. Pentru că sistemul implicit apelează HttpUtility.UrlDecode("xxx", codificarea configurației sistemului) o dată, Așadar, apelezi din nou la HttpUtility.UrlEncode("xxx", codarea configurată de sistem) pentru a reveni la parametrul original de codare urt-8
Apoi folosește HttpUtility.UrlDecode("xxx", utf-8) pentru a-l decoda. Șirul AAA = Cerere. Request.QueryString["admin"]; Proprietar string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); șirul a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|