Сьогодні вранці колега поставив мені запитання: я сказав, що отримані параметри були спотворені, дозвольте мені допомогти це розв'язати.
Платформа, за яку відповідає мій колега, побудована 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"]; Власник будинку string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); рядок a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|