Тази сутрин колега ми зададе въпрос: казах, че получените параметри са объркани, нека помогна да се реши.
Платформата, за която отговаря колегата ми, е изградена Ext.js фреймуърк, а конфигурационният файл web.config е конфигуриран с глобалното кодиране "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Когато фронтендът изпрати "китайски текст", бекендът получава изкривени знаци с Request.QueryString["xxx"].
Без значение как декодирате с System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), не работи.
Описание на принципа: 1: Първото нещо, което трябва да се определи, е че когато се подадат URL параметрите на клиента, Ext.js ги кодира преди да ги изпратят, а кодирането на клиента по подразбиране е UTF-8
2: Тогава защо е объркан при получаване на параметри с Request.QueryString["xxx"]?
Обръщаме компилацията стъпка по стъпка, 2.1: Погледнете кода за свойството QueryString:
2.2: Изрязване към метода FillInQueryStringCollection()
2.3: Изрязване: QueryStringEncoding
От кода QueryStringEncoding системата по подразбиране използва метода на кодиране на глобализационния конфигурационен възел, а ако не, по подразбиране кодирането е UTF-8 2.4: Разрязване на FillFromString (низ s, bool urlencoded, кодиране на кодиране)
От тази точка откриваме, че всички входове на параметри се извикват веднъж: HttpUtility.UrlDecode(str2, кодиране);
Когато клиентът js изпраща китайски език на сървъра в utf-8 кодиране, когато го получава с Request.QueryString, първо го декодира веднъж с gb2312, конфигуриран чрез глобализация, което води до изкривени знаци.
1: JS методът за кодиране е URT-8
2: Сървърната страна е конфигурирала по подразбиране GB2312
3: Request.QueryString по подразбиране извиква HttpUtility.UrlDecode, за да декодира получените параметри с кодиране на системната конфигурация.
1: Системата избира стандартното кодиране в следния ред: http request header - >globalization configuration node - default UTF-8
2: При въвеждане на URL адреса директно на китайски, различните браузъри могат да го обработват по различен начин, например: IE не кодира и изпраща директно, Firefox подава URL адреса след кодиране на GB2312.
3: За некодирани "китайски знаци", след използване на вътрешното извикване на Request.QueryString HttpUtility.UrlDecode, чрез gb2312->utf-8,
Ако китайският знак не бъде намерен, той по подразбиране ще бъде конвертиран в "%ufffd", което води до необратими изкривени знаци.
4: Пътят към разрешаването Познавайки принципа, има много начини да се реши: 1: Глобалното обединение е UTF-8 кодиране, което спестява неудобства и тревоги.
2: Когато GB2312 е глобално зададен, URL-то е китайски, а js трябва да бъде кодиран, като ext.js framework.
По този начин можеш да го обработиш само специално, като специфицираш кодирането и декодирането от страна на сървъра. Тъй като по подразбиране системата извиква HttpUtility.UrlDecode("xxx", кодирането на конфигурацията на системата) веднъж, Затова отново извикваш HttpUtility.UrlEncode("xxx", кодирането, конфигурирано от системата), за да се върнеш към оригиналния параметър urt-8
След това използвайте HttpUtility.UrlDecode("xxx", utf-8), за да го декодирате. Низ AAA = заявка. Request.QueryString["admin"]; Собственик на жилище string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); низ a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|