Dnes ráno mi kolega položil otázku: řekl jsem, že parametry, které jsem obdržel, jsou zkreslené, nechte mě to vyřešit.
Platforma, za kterou je můj kolega zodpovědný, je postavena Ext.js frameworku a konfigurační soubor web.config je nakonfigurován s globálním kódováním "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Když frontend odešle "čínský text", backend přijme zkreslené znaky s Request.QueryString["xxx"].
Ať dekódujete jakkoliv pomocí System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), nefunguje to.
Popis principu: 1: První věc, kterou je třeba zjistit, je, že když jsou zadány URL parametry klienta, Ext.js je před odesláním zakóduje a klient má výchozí kódování UTF-8
2: Proč je tedy zkreslený při přijímání parametrů pomocí Request.QueryString["xxx"]?
Postupně obráceme kompilaci, 2.1: Podívejte se na kód vlastnosti QueryString:
2.2: Rozřízněte metodu FillInQueryStringCollection()
2.3: Cut: QueryStringEncoding
Z kódu QueryStringEncoding systém automaticky přechází na kódovací metodu globalizačního konfiguračního uzlu, a pokud ne, výchozím je kódování UTF-8 2.4: Rozříznout do FillFromString (string s, bool urlencoded, kódování kódování)
Od tohoto bodu zjistíme, že všechny vstupy parametrů jsou volány jednou: HttpUtility.UrlDecode(str2, encoding);
Když klient js odešle čínsky jazyk serveru v kódování utf-8, při přijetí pomocí Request.QueryString jej nejprve jednou dekóduje pomocí gb2312 nakonfigurovaného globalizací, což vede ke zkresleným znakům.
1: Metoda kódování JS je URT-8
2: Na straně serveru je nastavena výchozí hodnota na GB2312
3: Request.QueryString bude ve výchozím nastavení volat HttpUtility.UrlDecode pro dekódování přijatých parametrů pomocí kódování systémové konfigurace.
1: Systém vybírá výchozí kódování v následujícím pořadí: HTTP request header - >globalization configuration node - default UTF-8
2: Při přímém zadání URL do čínštiny mohou různé prohlížeče zpracovávat URL odlišně, například: IE nekóduje a odesílá přímo, Firefox odesílá URL až po kódování GB2312.
3: Pro nekódované "čínské znaky" po použití interního volání Request.QueryString HttpUtility.UrlDecode, od gb2312->utf-8,
Pokud čínský znak není nalezen, bude ve výchozím nastavení převeden na "%ufffd", což vede k nevratně zkresleným znakům.
4: Cesta k řešení S ohledem na princip existuje mnoho způsobů, jak ho vyřešit: 1: Globální sjednocení je kódování UTF-8, které šetří potíže a obavy.
2: Když je GB2312 globálně specifikován, url je čínská a js musí být zakódován, například ext.js frameworku.
Tímto způsobem to můžete řešit jen speciálně, specifikovat kódování a dekódování na straně serveru. Protože výchozí systém volá HttpUtility.UrlDecode ("xxx", kódování systémové konfigurace) jednou, Takže znovu voláte HttpUtility.UrlEncode ("xxx", kódování nastavené systémem), abyste se vrátili k původnímu parametru kódování urt-8
Pak použijte HttpUtility.UrlDecode("xxx", utf-8) k jeho dekódování. řetězec aaa = požadavek. Request.QueryString["admin"]; Majitel domu string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|