Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 22544|Отговор: 0

[Източник] c# Request получава изкривени символи за параметри

[Копирай линк]
Публикувано в 25.12.2015 г. 18:41:49 ч. | | | |


Тази сутрин колега ми зададе въпрос: казах, че получените параметри са объркани, нека помогна да се реши.


Платформата, за която отговаря колегата ми, е изградена 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);








Предишен:Здравей
Следващ:Какъв алгоритъм, депресиран съм от няколко дни.
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com