Dziś rano kolega zadał mi pytanie: powiedziałem, że otrzymane parametry są zniekształcone, pozwól, że pomogę to rozwiązać.
Platforma, za którą odpowiada mój kolega, jest zbudowana Ext.js frameworku, a plik konfiguracyjny web.config skonfigurowany jest z globalnym kodowaniem "GB2312":
<globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/>
Gdy frontend wysyła "tekst chiński", backend otrzymuje zniekształcone znaki z Request.QueryString["xxx"].
Bez względu na to, jak dekodujesz za pomocą System.Web.HttpUtility.UrlDecode("xxx", "encoding type"), to nie działa.
Opis zasady: 1: Pierwszą rzeczą, którą należy ustalić, jest to, że po przesłaniu parametrów URL klienta Ext.js je zakoduje przed przesłaniem, a kodowanie klienta jest domyślnie kodowane UTF-8
2: Dlaczego więc jest zniekształcony przy odbieraniu parametrów za pomocą Request.QueryString["xxx"]?
Krok po kroku odwracamy kompilację, 2.1: Sprawdź kod właściwości QueryString:
2.2: Wycięcie metody FillInQueryStringCollection()
2.3: Cięcie: QueryStringEncoding
Z kodu QueryStringEncoding system domyślnie przyjmuje metodę kodowania węzła konfiguracyjnego globalizacji, a jeśli nie, domyślnym jest kodowanie UTF-8 2.4: Wycięte do FillFromString (string s, bool urlencoded, kodowanie kodowania)
Od tego momentu okazuje się, że wszystkie parametry wejściowe są wywoływane raz: HttpUtility.UrlDecode(str2, encoding);
Gdy klient js przesyła chiński do serwera w kodowaniu utf-8, po odbieraniu go za pomocą Request.QueryString najpierw dekoduje go raz za pomocą gb2312 skonfigurowanego przez globalizację, co skutkuje zniekształconymi znakami.
1: Metoda kodowania JS to URT-8
2: Strona serwera skonfigurowała domyślnie GB2312
3: Request.QueryString domyślnie wywołuje HttpUtility.UrlDecode, aby zdekodować odebrane parametry z kodowaniem konfiguracji systemu.
1: System wybiera domyślne kodowanie w następującej kolejności: nagłówek HTTP request - >węzeł konfiguracji globalizacji - domyślny UTF-8
2: Przy wpisaniu adresu URL bezpośrednio w języku chińskim, różne przeglądarki mogą obsługiwać go inaczej, na przykład: IE nie koduje i wysyła bezpośrednio URL, Firefox wysyła URL po kodowaniu GB2312.
3: Dla niezakodowanych "znaków chińskich", po użyciu wewnętrznego Request.QueryString wywołaj HttpUtility.UrlDecode, by gb2312->utf-8,
Jeśli znak chiński nie zostanie znaleziony, zostanie domyślnie zamieniony na "%ufffd", co skutkuje nieodwracalnymi zniekształconymi znakami.
4: Droga do rozwiązania Znając zasadę, istnieje wiele sposobów na jej rozwiązanie: 1: Globalne zjednoczenie to kodowanie UTF-8, co oszczędza kłopotów i zmartwień.
2: Gdy GB2312 jest globalnie określony, adres URL jest chiński, a js musi być zakodowany, na przykład ext.js framework.
W ten sposób możesz obsługiwać go tylko specjalnie, określając kodowanie i dekodowanie po stronie serwera. Ponieważ domyślny system wywołuje HttpUtility.UrlDecode ("xxx", kodowanie konfiguracji systemowej) raz, Więc ponownie wywołujesz HttpUtility.UrlEncode ("xxx", kodowanie skonfigurowane przez system), aby wrócić do oryginalnego parametru kodowania urt-8
Następnie użyj HttpUtility.UrlDecode("xxx", utf-8) do dekodowania. String aaa = żądanie. Request.QueryString["admin"]; Właściciel domu string a1 = HttpUtility.UrlEncode(aaa, System.Text.Encoding.GetEncoding("GB2312")); string a2 = HttpUtility.UrlDecode(a1,System.Text.Encoding.UTF8);
|