Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 22544|Ответ: 0

[Источник] Запрос c# получает искажённые символы параметров

[Скопировать ссылку]
Опубликовано 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-запроса - >узел конфигурации глобализации - по умолчанию 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 фреймворк.

Таким образом, вы можете работать только специально, указывая кодирование и декодирование на стороне сервера.
Поскольку система по умолчанию вызывает HttpUtility.UrlDecode("xxx", кодирование конфигурации системы) один раз,
Поэтому вы снова вызываете HttpUtility.UrlEncode("xxx", кодирование, настроенное системой), чтобы вернуться к исходному параметру кодирования urt-8

Затем используйте HttpUtility.UrlDecode("xxx", utf-8) для декодирования.
строка AAA = запрос. Request.QueryString["admin"];    Владелец дома
                            строка 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